【问题标题】:SQL Server 2014 pivot table row and column month grant totalSQL Server 2014 数据透视表行和列月授权总计
【发布时间】:2021-06-16 10:50:22
【问题描述】:

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

但是,我做不到。

    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

【问题讨论】:

  • 请不要对我们大喊大叫;我们可以很好地阅读小写字母。谢谢。
  • 我正在用谷歌翻译写作。这是我第一次发消息。确实,我是这里的新手。我一直不明白你的意思。不过,还是感谢您的关注。

标签: sql-server pivot sql-server-2014 dayofmonth


【解决方案1】:

使用条件聚合比限制性的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,
       SUM(CASE DATEPART(MONTH,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,
       SUM(CASE DATEPART(MONTH,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,
       SUM(CASE DATEPART(MONTH,DueDate) WHEN 8 THEN OrderQty END) AS August,
       SUM(CASE DATEPART(MONTH,DueDate) WHEN 9 THEN OrderQty END) AS September,
       SUM(CASE DATEPART(MONTH,DueDate) WHEN 10 THEN OrderQty END) AS October,
       SUM(CASE DATEPART(MONTH,DueDate) WHEN 11 THEN OrderQty END) AS November,
       SUM(CASE DATEPART(MONTH,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)),
    ()
);

【讨论】:

  • 您好,感谢您的支持。然而,这并没有解决问题。我想按月获取行和列的总数。怎么办?
  • 您需要提供 consumable 样本数据和预期结果,@VelvetDreams。
  • 图片到图片没有帮助,@VelvetDreams。正如我所说,它必须是消耗品,并且您需要将其作为edit 提供给您的问题。
  • @VelvetDreams 添加了总计行
  • 查理脸,拉努感谢您的帮助。如果我们删除 YEAR 列,我该如何编辑?另外,由于我们目前是在六月,其他月份都是 NULL。在这种情况下如何添加 ISNULL ?最好的问候
猜你喜欢
  • 1970-01-01
  • 2012-11-05
  • 2012-03-24
  • 2017-05-27
  • 1970-01-01
  • 2012-11-18
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多