【问题标题】:sql pivot and calculated columnsql数据透视和计算列
【发布时间】:2017-02-23 22:54:37
【问题描述】:

我正在尝试汇总一个查询,该查询按客户逐月显示收入,以及最后一列中所有月份的 SUM(Revenue)。到目前为止,我在下面有这个查询。这是尽可能接近我正在寻找的东西:

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 |
+----------+----------+----------+---------+

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      相关资源
      最近更新 更多