【问题标题】:SQL Server : return zero all rows if sub-query result IS NULLSQL Server:如果子查询结果为空,则所有行返回零
【发布时间】:2017-02-10 21:04:03
【问题描述】:

如果子查询没有返回行,我需要返回零。我尝试了在 SO 上找到的多个建议,但无济于事,以及案例陈述和合并。

我的最终目标是将生成的子查询结果加在一起,但由于“杂项”查询不返回任何行,因此 TTL 字段为空白。

我哪里错了,我该如何纠正?

Select 
    s.STID,
    rent.amt As RENT,
    misc.amt As MISC,
    rent.amt + misc.amt As TTL
From 
    (Select 
         s.STID
     From 
         Stores s
     Where 
         s.STID Not In (7, 999) ) As s
Left Join 
    (Select 
         Income.STID,
         Sum(Case When Income.Amount Is Null Then 0 Else Income.Amount End) As amt
     From 
         Income
     Inner Join 
         IncomeTypes On IncomeTypes.IncTypeID = Income.IncTypeID
     Inner Join 
         IncomeSection On IncomeSection.IncSecID = IncomeTypes.IncSecID
     Where 
         Income.IncomeDate = dbo.getdateparam(92, 999) And
         IncomeTypes.IncTypeID In (1, 2)
     Group By 
         Income.STID) As rent on s.STID = rent.STID
Left Join 
    (Select 
         Income.STID,
         Coalesce(Sum(Income.Amount), 0) As amt
     From 
         Income
     Inner Join 
         IncomeTypes On IncomeTypes.IncTypeID = Income.IncTypeID
     Inner Join 
         IncomeSection On IncomeSection.IncSecID = IncomeTypes.IncSecID
     Where 
         Income.IncomeDate = dbo.getdateparam(92, 999) And
         IncomeTypes.IncTypeID In (20, 21, 22)
     Group By 
         Income.STID) As misc On s.STID = misc.STID
Order By 
    s.STID

目前返回:

STID    RENT      MISC    TTL
1       1234.56 
2       1234.56 
3       1234.56 
4       1234.56 
5       1234.56 

我花了三个小时试图返回如下:

STID    RENT      MISC    TTL
1       1234.56   0       1234.56
2       1234.56   0       1234.56 
3       1234.56   0       1234.56 
4       1234.56   0       1234.56 
5       1234.56   0       1234.56 

【问题讨论】:

    标签: sql-server subquery


    【解决方案1】:

    使用COALESCE:

    Select  s.STID
          , rent.amt As RENT
          , Coalesce(misc.amt, 0) As MISC
          , rent.amt + Coalesce(misc.amt, 0) As TTL
    From    (Select s.STID
             From   Stores s
             Where  s.STID Not In (7, 999)
            ) As s
    Left Join (Select   Income.STID
                      , Sum(Case When Income.Amount Is Null Then 0
                                 Else Income.Amount
                            End) As amt
               From     Income
               Inner Join IncomeTypes
                        On IncomeTypes.IncTypeID = Income.IncTypeID
               Inner Join IncomeSection
                        On IncomeSection.IncSecID = IncomeTypes.IncSecID
               Where    Income.IncomeDate = dbo.getdateparam(92, 999)
                        And IncomeTypes.IncTypeID In (1, 2)
               Group By Income.STID
              ) As rent
            On s.STID = rent.STID
    Left Join (Select   Income.STID
                      , Coalesce(Sum(Income.Amount), 0) As amt
               From     Income
               Inner Join IncomeTypes
                        On IncomeTypes.IncTypeID = Income.IncTypeID
               Inner Join IncomeSection
                        On IncomeSection.IncSecID = IncomeTypes.IncSecID
               Where    Income.IncomeDate = dbo.getdateparam(92, 999)
                        And IncomeTypes.IncTypeID In (20, 21, 22)
               Group By Income.STID
              ) As misc
            On s.STID = misc.STID
    Order By s.STID;
    

    COALESCE 采用提供的值中的第一个非NULL 值。如果misc.amtNULL,它将默认为第二个值0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多