SQL - 子查询中的SUM

时间:2017-08-21 12:05:34

标签: sql

我有以下代码来查看不同产品的SalesVol并按事务分组对其进行分组

SELECT a.transaction_week,
SUM(CASE WHEN record_type IN (6,37,13) THEN quantity ELSE 0 END) as SalesVol
FROM table 1 a 
LEFT JOIN table 2 b ON b.Date = a.transaction_date
LEFT JOIN table 3 c ON c.sku = a.product
WHERE series in (62,236,501,52)
GROUP BY a.transaction_week
ORDER BY a.transaction_week

| tw | SalesVol |
| 1  | 4768 |         
| 2  | 4567 |
| 3  | 4354 |
| 4  | 4678 | 

我希望能够在多个子查询中更改序列号,例如。

SELECT a.transaction_week,

(SELECT SUM(CASE WHEN record_type IN (6,37,13) THEN quantity ELSE 0 END) as SalesVol 
FROM table 1 a 
LEFT JOIN table 2 b ON b.Date = a.transaction_date
LEFT JOIN table 3 c ON c.sku = a.product
WHERE series in (62,236,501,52)) as personal care

(SELECT SUM(CASE WHEN record_type IN (6,37,13) THEN quantity ELSE 0 END) as SalesVol 
FROM table 1 a 
LEFT JOIN table 2 b ON b.Date = a.transaction_date
LEFT JOIN table 3 c ON c.sku = a.product
WHERE series in (37,202,203,456)) as white goods

FROM table 1 a 
LEFT JOIN table 2 b ON b.Date = a.transaction_date
LEFT JOIN table 3 c ON c.sku = a.product
GROUP BY a.transaction_week
ORDER BY a.transaction_week

我无法使子查询正常工作,因为它给了我整体总和值而不是按事务分组对其进行分组

4 个答案:

答案 0 :(得分:1)

不是使用子查询,而是将series添加到CASE语句的条件中:

SELECT a.transaction_week,
  sum(CASE WHEN series IN (62,236,501,52) AND record_type IN (6,37,13)
         THEN quantity ELSE 0 END) as personal_care, 
  sum(CASE WHEN series IN (37,202,203,456) AND record_type IN (6,37,13)
         THEN quantity ELSE 0 END) as white_goods 
FROM table 1 a 
LEFT JOIN table 2 b ON b.Date = a.transaction_date
LEFT JOIN table 3 c ON c.sku = a.product
GROUP BY a.transaction_week
ORDER BY a.transaction_week;

答案 1 :(得分:0)

您只是错过了子查询中的a.transaction_week。外部查询中的JOIN是不必要的。

SELECT a.transaction_week,
(
  SELECT SUM(CASE WHEN record_type IN (6,37,13) THEN quantity ELSE 0 END) as SalesVol 
  FROM table 1 a2 
  LEFT JOIN table 2 b ON b.Date = a2.transaction_date
  LEFT JOIN table 3 c ON c.sku = a2.product
  WHERE series in (62,236,501,52) AND a2.transaction_week = a.transaction_week
) as personal care,
(
  SELECT SUM(CASE WHEN record_type IN (6,37,13) THEN quantity ELSE 0 END) as SalesVol 
  FROM table 1 a 2
  LEFT JOIN table 2 b ON b.Date = a2.transaction_date
  LEFT JOIN table 3 c ON c.sku = a2.product
  WHERE series in (37,202,203,456)  AND a2.transaction_week = a.transaction_week
) as white goods
FROM table 1 a 
GROUP BY a.transaction_week
ORDER BY a.transaction_week

答案 2 :(得分:0)

您应该使用UNION运算符。请参阅以下查询:

select  a.transaction_week, SalesVol from
(SELECT a.transaction_week as transaction_week,
SUM(CASE WHEN record_type IN (6,37,13) THEN quantity ELSE 0 END) as SalesVol
FROM table 1 a 
LEFT JOIN table 2 b ON b.Date = a.transaction_date
LEFT JOIN table 3 c ON c.sku = a.product
WHERE series in (62,236,501,52)
UNION   
SELECT a.transaction_week as transaction_week,
SUM(CASE WHEN record_type IN (6,37,13) THEN quantity ELSE 0 END) as SalesVol
FROM table 1 a 
LEFT JOIN table 2 b ON b.Date = a.transaction_date
LEFT JOIN table 3 c ON c.sku = a.product
WHERE series in (37,202,203,456)
) AS tbl1
GROUP BY tbl1.transaction_week
ORDER BY tbl1.transaction_week

答案 3 :(得分:0)

尝试此功能快速以及符合您的要求:

SELECT  a.transaction_week ,
        whitegoods.SalesVol AS 'White Goods' ,
        personalcare.SalesVol1 AS 'Personal Care'
FROM    table1 a
        LEFT JOIN table2 b ON b.[Date] = a.transaction_date
        LEFT JOIN table3 c ON c.sku = a.product
        CROSS APPLY ( SELECT    SUM(CASE WHEN record_type IN ( 6, 37, 13 )
                                         THEN quantity
                                         ELSE 0
                                    END) AS SalesVol
                      FROM      table1 a2
                      WHERE     b.[Date] = a2.transaction_date
                                AND c.sku = a2.product
                                AND series IN ( 37, 202, 203, 456 )
                                AND a2.transaction_week = a.transaction_week
                    ) whitegoods
        CROSS APPLY ( SELECT    SUM(CASE WHEN record_type IN ( 6, 37, 13 )
                                         THEN quantity
                                         ELSE 0
                                    END) AS SalesVol1
                      FROM      table1 a2
                      WHERE     b.[Date] = a2.transaction_date
                                AND c.sku = a2.product
                                AND series IN ( 62, 236, 501, 52 )
                                AND a2.transaction_week = a.transaction_week
                    ) personalcare
GROUP BY a.transaction_week
ORDER BY a.transaction_week