CTE не может суммировать пустые столбцы из нескольких столбцов - PullRequest
0 голосов
/ 06 июня 2018

Я хочу вычислить столбец total_revenue для каждой строки, но cte этого не делает.Я получаю столбец pr как пустой в течение нескольких месяцев и имеет значение для некоторых.Так что я получаю total_revenue, где столбец pr не пустой.Что я делаю не так?

ormonth     cc_o    cc_r      po    pr  po_o    po_r    total_orders    total_revenue
2018-06     1367    152903.89   0       44     6424.66    1411  
2018-05     10069   1086544.02  0       242    27926.02   10311 
2018-04     11208   1151114.03  0       221    26004.69   11429 
2018-01     13416   1379387.01  0       152    17023.29   13568 
2018-03     12025   1303165.8   0       197    19957.87   12222 
2018-02     12647   1252867.33  0       171    16907.52   12818 
2018-01     145     1100.43     6  121  170    1600       321                2822

вот запрос, который я использовал:

with cte_Revenue as (
SELECT
    CONVERT(VARCHAR(7),Orders.OrderDate,126) as ormonth,
 COUNT(CASE WHEN Orders.paymentmethodid = 5 OR Orders.paymentmethodid = 6 THEN Orders.PaymentAmount END) as 'CC_O',
 SUM(CASE WHEN Orders.paymentmethodid = 5 OR Orders.paymentmethodid = 6 THEN Orders.PaymentAmount END) as 'CC_R',

COUNT(CASE WHEN Orders.paymentmethodid = 25 THEN Orders.paymentmethodid END) as 'PO',
 SUM(CASE WHEN Orders.paymentmethodid = 25 THEN Orders.PaymentAmount  END ) as 'PR',

COUNT(CASE WHEN Orders.paymentmethodid = 1 THEN Orders.paymentmethodid END) as 'PO_O',
 SUM(CASE WHEN Orders.paymentmethodid = 1 THEN Orders.PaymentAmount END ) as 'PO_R'
FROM
    Orders
WHERE
    Orders.OrderDate BETWEEN '01/01/2018' AND getdate() -0 AND
    Orders.OrderStatus <> 'Cancelled'
GROUP BY
    CONVERT(VARCHAR(7),Orders.OrderDate,126))
Select 
ormonth,
CC_O,
CC_R,
PO,
PR,
PO_O,
PO_R,
(CC_O+PO+PO_O) AS Total_Orders,
(CC_R+PR+PO_R) AS Total_Revenue
FROM cte_Revenue

1 Ответ

0 голосов
/ 11 июня 2018

Похоже, что столбец PR может возвращать NULL, что приведет к тому, что вычисление не будет выполнено.Как я упоминал в комментариях, может быть, оператор CASE в SELECT решит проблему.

SELECT ormonth, CC_O, CC_R, PO, PR, PO_O, PO_R, 
       (CC_O + PO + PO_O) AS Total_Orders, 
       (CC_R + CASE WHEN PR IS NULL THEN 0 ELSE PR END + PO_R) AS Total_Revenue
FROM   cte_Revenue

Другой вариант - убедиться, что в CTE столбец PR всегда будет иметь значение.Помещение в операторы ELSE в CTE, которые будут возвращать 0, также может помочь.

Например:

 COUNT(CASE WHEN Orders.paymentmethodid = 1 THEN Orders.paymentmethodid 
            ELSE 0 END) as 'PO_O',
 SUM(CASE WHEN Orders.paymentmethodid = 1 THEN Orders.PaymentAmount  
            ELSE 0 END ) as 'PO_R'
...