2017-02-10 4 views
0

Мне нужно вернуть ноль, если подзапрос не возвращает строк. Я попробовал несколько предложений, найденных здесь, на SO, безрезультатно, вместе с аргументом case и coalesce.SQL Server: возвращает нуль всех строк, если результат суб-запроса IS NULL

Моя конечная цель состоит в том, чтобы суммировать полученные результаты подзапроса вместе, но поскольку запрос «misc» не возвращает строк, поле 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 

ответ

3

Использование 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.amt - NULL, то оно по умолчанию будет соответствовать второму значению, 0.

+0

Я идиот. Спасибо, Сиюаль. – thelincster