Вычитание в SQL select возвращает 0 - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть запрос, один из столбцов (последний) которого должен быть результатом вычитания двух других. Моя проблема в том, что если один из операндов равен нулю, то в результате я тоже получаю ноль. Вот пример

SELECT 
#TmpDates.Date As Registration, 
ISNULL(Cr.NewSubscriptionsCount,0) As 'Initial Size',
ISNULL(U.UnsubsCount, 0) As 'Unsub. Count',
ISNULL(Cr.NewSubscriptionsCount - U.UnsubsCount, 0) As 'Alive count',
ISNULL(Cl.ClicksCount, 0) As Clicks,
CAST(ISNULL(C.Cost, 0) AS MONEY) As Cost,
CAST(ISNULL(P.Profit, 0) AS MONEY) As Revenue,
CAST(ISNULL((P.Profit - C.Cost), 0) AS MONEY) As Profit

FROM 

    #TmpDates 
    LEFT JOIN #TmpUnsubs U ON #TmpDates.Date = U.CreationDate   
    LEFT JOIN #TmpCreated Cr ON #TmpDates.Date = Cr.CreationDate
    LEFT JOIN #TmpClicks Cl ON #TmpDates.Date = Cl.SubscriptionCreationDate
    LEFT JOIN #TmpCost C ON #TmpDates.Date = C.CreationDate
    LEFT JOIN #TmpProfit P ON #TmpDates.Date = P.SubscriptionCreationDate

Вот результат:

+------------+---+---+---+---+------+------+------+
| 2019-03-01 | 2 | 2 | 0 | 7 | 0.00 | 6.20 | 0.00 |
+------------+---+---+---+---+------+------+------+
| 2019-03-02 | 0 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| 2019-03-03 | 1 | 1 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| 2019-03-04 | 2 | 2 | 0 | 2 | 0.00 | 0.40 | 0.00 |
| 2019-03-05 | 1 | 1 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| 2019-03-06 | 4 | 1 | 3 | 5 | 0.00 | 3.20 | 0.00 |
| 2019-03-07 | 4 | 4 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| 2019-03-08 | 1 | 1 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| 2019-03-09 | 3 | 1 | 2 | 8 | 0.00 | 2.90 | 0.00 |
| 2019-03-10 | 4 | 3 | 1 | 0 | 0.00 | 0.00 | 0.00 |
| 2019-03-11 | 3 | 3 | 0 | 0 | 0.00 | 0.00 | 0.00 |
| 2019-03-12 | 3 | 2 | 1 | 3 | 0.30 | 0.55 | 0.25 |
+------------+---+---+---+---+------+------+------+

1 Ответ

6 голосов
/ 03 апреля 2019

Когда один из них NULL, вы получите 0. То, что вы хотите:

CAST(ISNULL(P.Profit, 0) - ISNULL(C.Cost, 0) AS MONEY) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...