我正在查询某公司的加盟店或自营店的订单数量。它们被归入日期差异类别。以下是查询和结果作为说明:
SELECT [Order-Delivery Difference], [Type], COUNT(DISTINCT OrderId) AS [Number of Orders]
FROM (SELECT DDIFF AS [Order-Delivery Difference], Franchise AS [Type], OrderId, [Net Value]
FROM joined
GROUP BY DDIFF, FRANCHISE, OrderId, [Net Value]
) AS subquery
GROUP BY [Order-Delivery Difference], [Type]
HAVING SUM([Net Value]) > 0
ORDER BY [Order-Delivery Difference]
;
我的表中有一个 Date
类型列,我们将其称为 DateColumn
。理论上我可以按任何给定的特定时间过滤此结果。
...
(SELECT DDIFF AS [Order-Delivery Difference], Franchise AS [Type], OrderId, [Net value]
FROM joined
WHERE DATEPART(year, [DateColumn]) = 2017 AND DATEPART(month, [DateColumn]) = 1
GROUP BY DDIFF, FRANCHISE, OrderId, [Net Value]
) AS subquery
...
但我想为“日期”列中可用的每个不同月份日期转换此结果,如下所示:
我的问题是: 我可以创建一个像这样的数据透视表,在开头有另一列吗?或者我应该为每个不同的 O-D 差异类别创建一个数据透视表?有没有实用的方法可以做到这一点?
还有一个程序解决方案来创建一个包含所有不同月份日期的列,以将其作为数据透视函数的动态属性集?
最佳答案
也许这会有所帮助
示例
Declare @SQL varchar(max) = '
Select *
From (
Select [Order-Delivery Difference] = DDIFF
, [Type] = Franchise
, [Value] = COUNT(DISTINCT OrderId)
, [Item] = left(DateColumn,7)
From JOINED
Group By DDIFF,Franchise,left(DateColumn,7)
) A
Pivot (sum(Value) For [Item] in (' + Stuff((Select Distinct ',' + QuoteName(left(DateColumn,7)) From JOINED Order By 1 For XML Path('')),1,1,'') + ') ) p
Order By [Order-Delivery Difference]
,Type
'
--Print @SQL
Exec(@SQL);
示例数据如下所示
结果看起来像这样
EDIT- CORRECTED FOR FRANCHISE COLUMN
对于东西部分
Select Distinct ',' + QuoteName(left(DateColumn,7)) From #JOINED
生成
(No column name)
,[2017-01]
,[2017-02]
当我们添加 For XML 时,我们得到一个 XML 字符串
,[2017-01],[2017-02]
然后 STUFF(...,1,1,'')
删除前导逗号,成为 PIVOT 列
[2017-01],[2017-02]
关于sql - 如何动态地透视每个月的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56793794/