首页 > 解决方案 > sql server 中的多列数据透视

问题描述

我有一些关于如何制作查询结果的问题在此处输入图像描述

这是我尝试过的,但与我的意思不完全相同

CREATE TABLE #dta  
(  
 Data [nvarchar](max),  
 Date [varchar] (12) ,  
 GR [int]  ,
 Refund [int]  ,
 Sales [int]  ,
)  

 INSERT INTO #dta  
 SELECT 'asd',1,10,0,0 UNION ALL  
 SELECT 'asd',2,0,0,4 UNION ALL  
 SELECT 'asd',3,4,1,1 UNION ALL  
 SELECT 'qwe',1,2,0,0 UNION ALL  
 SELECT 'qwe',3,0,0,1 UNION ALL  
 SELECT 'zxc',1,0,0,5 UNION ALL  
 SELECT 'zxc',2,4,0,1 UNION ALL  
 SELECT 'zxc',3,0,1,5 


--Only for sales
SELECT data, [1],[2],[3] FROM   
(SELECT data, [date] , Sales FROM #dta )Tab1  
PIVOT  
(  
SUM(Sales) FOR [date] IN ([1],[2],[3])) AS Tab2  
ORDER BY Tab2.Data  

标签: sql-serverpivot-table

解决方案


您可以使用条件聚合并尝试以下代码:

 SELECT t.[Data]
       ,MAX(CASE WHEN t.[Date]=1 THEN t.Sales END) AS [Sales_Date_1]
       ,MAX(CASE WHEN t.[Date]=1 THEN t.Refund END) AS [Refund_Date_1]
       ,MAX(CASE WHEN t.[Date]=1 THEN t.GR END) AS [GR_Date_1]
       ,MAX(CASE WHEN t.[Date]=2 THEN t.Sales END) AS [Sales_Date_2]
       ,MAX(CASE WHEN t.[Date]=2 THEN t.Refund END) AS [Refund_Date_2]
       ,MAX(CASE WHEN t.[Date]=2 THEN t.GR END) AS [GR_Date_2]
       ,MAX(CASE WHEN t.[Date]=3 THEN t.Sales END) AS [Sales_Date_3]
       ,MAX(CASE WHEN t.[Date]=3 THEN t.Refund END) AS [Refund_Date_3]
       ,MAX(CASE WHEN t.[Date]=3 THEN t.GR END) AS [GR_Date_3]
 FROM #dta t
 GROUP BY t.[Data];

如果(示例数据中的 1 到 3)的计数t.[Date]不限于已知最大值,则您必须动态创建语句。

如果您的t.[Date]列实际上是一个日期值,并且您希望您的输出列以您的集合中的某些日期值(不可预测的列别名)命名,那么您也必须动态创建它。


推荐阅读