sql - 如何动态地透视每个月的数据?

标签 sql sql-server t-sql

我正在查询某公司的加盟店或自营店的订单数量。它们被归入日期差异类别。以下是查询和结果作为说明:

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]
;

enter image description here

我的表中有一个 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
...

但我想为“日期”列中可用的每个不同月份日期转换此结果,如下所示:

enter image description here

我的问题是: 我可以创建一个像这样的数据透视表,在开头有另一列吗?或者我应该为每个不同的 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);

示例数据如下所示

enter image description here

结果看起来像这样

enter image description here

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/

相关文章:

sql - 运行更新sql语句的shell脚本

sql - 了解 Snowflake 中的锁和查询状态(对单个表的多次更新)

sql-server - SQL Server 2016 中的 SQL Server 配置管理器在哪里

sql-server - 标量函数 fn_cdc_get_min_lsn() 不断返回 '0x00000000000000000000' 以获得有效的表名?

sql - 使用 SQL + XQuery 将 Xml 转换为基于列的数据

mysql - SQL LEFT JOIN 到一个新行

mysql - 在线sql查询

sql - 如何在 SQL SERVER 2008 中使用 LAG FUNCTION

t-sql - 通过 T-SQL 获取结果集的列名

sql-server - 使用 Select 语句和聚合函数从另一个表更新表