微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server 2014 数据透视表行列月授予总数

如何解决SQL Server 2014 数据透视表行列月授予总数

如何在下表中添加行和列总计? 我想按月获得总计和总计。

但是,我做不到。

    SELECT *
FROM(
  SELECT
    YEAR(DueDate) [Year],CASE MONTH(DueDate)
      WHEN 1 THEN 'January'
      WHEN 2 THEN 'February'
      WHEN 3 THEN 'march'
      WHEN 4 THEN 'April'
      WHEN 5 THEN 'May'
      WHEN 6 THEN 'June'
      WHEN 7 THEN 'July'
      WHEN 8 THEN 'August'
      WHEN 9 THEN 'September'
      WHEN 10 THEN 'October'
      WHEN 11 THEN 'November'
      WHEN 12 THEN 'December'
    END as [Month],ProductID,OrderQty
  FROM Production.WorkOrder
) WorkOrders
PIVOT
(
  SUM(OrderQty)
  FOR [Month] IN (
    [January],[February],[march],[April],[May],[June],[July],[August],[September],[October],[November],[December]
  )
) AS Pivottable
ORDER BY [Year],ProductID

解决方法

使用条件聚合比限制性的 PIVOT 运算符更容易

没有样本数据,也没有预期的结果,这不会被测试,但你应该能够通过这样的事情实现你所追求的:

SELECT CASE WHEN GROUPING(DATEPART(YEAR,DueDate)) = 0 THEN
         CAST(DATEPART(YEAR,DueDate) AS varchar(50))
       ELSE 'GrandTotal' END AS [Year],SUM(CASE DATEPART(MONTH,DueDate) WHEN 1 THEN OrderQty END) AS January,--Don't use single quotes for alaises,DueDate) WHEN 2 THEN OrderQty END) AS Feburary,--it can be very confusing to read.
       SUM(CASE DATEPART(MONTH,DueDate) WHEN 3 THEN OrderQty END) AS March,--Single quotes are for literal strings.
       SUM(CASE DATEPART(MONTH,DueDate) WHEN 4 THEN OrderQty END) AS April,--Using ' for alias only work in the SELECT too,DueDate) WHEN 5 THEN OrderQty END) AS May,--something like ORDER BY 'January' would not
       SUM(CASE DATEPART(MONTH,DueDate) WHEN 6 THEN OrderQty END) AS June,--order by data by the column aliases as 'January'.
       SUM(CASE DATEPART(MONTH,DueDate) WHEN 7 THEN OrderQty END) AS July,DueDate) WHEN 8 THEN OrderQty END) AS August,DueDate) WHEN 9 THEN OrderQty END) AS September,DueDate) WHEN 10 THEN OrderQty END) AS October,DueDate) WHEN 11 THEN OrderQty END) AS November,DueDate) WHEN 12 THEN OrderQty END) AS December,SUM(OrderQty) AS GrandTotal,ProductID
FROM Production.WorkOrder
GROUP BY GROUPING SETS(
    (DATEPART(YEAR,DueDate),ProductID),(DATEPART(YEAR,DueDate)),()
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。