2017-02-23 345 views
0

我正在尝试放入一个查询,它显示了我逐月收入的客户以及最后一列中所有月份的SUM(收入)。到目前为止,我在下面有这个查询。这是接近我能得到我所期待的:sql数据透视表和计算列

SELECT cust_num as Customer, CONVERT(CHAR(4), date, 100) + CONVERT(CHAR(4), date, 120) AS 'Month', 
     SUM(q1.amount) AS Revenue 
FROM 
    (SELECT cust_num, inv_date AS date, 
      SUM(amount) AS amount 
    FROM artran_mst 
    WHERE (type = 'i') and cust_num = 'HON0994' and (inv_date BETWEEN '1/1/2017' AND '2/23/2017') 
    GROUP BY cust_num, inv_date 

    UNION ALL 

    SELECT cust_num, inv_date AS date, 
     SUM(amount*-1) AS amount 
    FROM artran_mst 
    WHERE (TYPE = 'c') and cust_num = 'HON0994' AND (inv_date BETWEEN '1/1/2017' AND '2/23/2017') 
    GROUP BY cust_num, inv_date 

    UNION ALL 
    SELECT cust_num, inv_date AS date, 
        SUM(amount) AS amount 
    FROM artran_mst 
    WHERE (TYPE = 'd') and cust_num = 'HON0994' 
    AND (inv_date BETWEEN '1/1/2017' AND '2/23/2017') 
    GROUP BY cust_num, inv_date) q1 
GROUP BY cust_num, MONTH(date), 
     CONVERT(CHAR(4), Date, 100) + CONVERT(CHAR(4), Date, 120) 
ORDER BY RIGHT(CONVERT(CHAR(4), date, 100) + CONVERT(CHAR(4), date, 120),4), 
     MONTH(date) 

它返回如下:

+----------+----------+---------+ 
| Customer | Month | Revenue | 
+----------+----------+---------+ 
| HON0994 | Jan 2017 | 1170662 | 
| HON0994 | Feb 2017 | 787066 | 
+----------+----------+---------+ 

我需要以某种方式添加一个支点和一个计算列,显示个月最后一列为“总计”的列。请参阅:

+----------+----------+----------+---------+ 
| Customer | Jan 2017 | Feb 2017 | Total | 
+----------+----------+----------+---------+ 
| HON0994 | 1170662 | 787066 | 1957728 | 
+----------+----------+----------+---------+ 

回答

1

我觉得你只是想有条件聚集:

SELECT cust_num, 
     (CASE WHEN inv_date >= '2017-01-01' and inv_date < '2017-02-01' 
      THEN (case when type = 'c' then - amount else amount end) 
     END) as jan_2017, 
     (CASE WHEN inv_date >= '2017-02-01' and inv_date < '2017-03-01' 
      THEN (case when type = 'c' then - amount else amount end) 
     END) as feb_2017, 
     SUM(case when type = 'c' then - amount else amount end) as total 
FROM artran_mst 
WHERE (type = 'i') and cust_num = 'HON0994' and 
     (inv_date >= '2017-01-01' and inv_date < '2017-03-01') 
GROUP BY cust_num;