多列的行列转换(PIVOT,UNPIVOT)
形式1
形式2
形式3
有时候可能会有这样的需求: 将一张表的所有列名转做为数据的一列数据,将一列数据作为整张表的列名
当列比较多时,只用PIVOT是解决不了的,经过研究,需要将UNPIVOT 和 PIVOT 联合使用
如上面的3个图,我们最终需要把形式1转换为形式3. 然而单用PIvot 解决不了问题,需要分两步转换
第一步:先通过UNPIVOT将所有列转换到数据中的一列,如形式2
第二步:通过PIVOT将另外一列数据作为列名
这样就实现了将源表的某列数据与列名互换.
1 SELECT [Week] AS [Date],[Total] AS WeeklyTotal 2 ,[Monday] 3 ,[Tuesday] 4 ,[Wednesday] 5 ,[Thursday] 6 ,[Friday] 7 ,[Saturday] 8 ,[Sunday] 9 FROM 10 ( 11 SELECT [Date],Data,[Week] 12 FROM 13 ( 14 SELECT A.Date 15 --CONVERT(VARCHAR(5),A.Date,101) AS [Date] 16 ,CONVERT(VARCHAR(20),A.NewVIPCounts) AS 新注册会员-- NewVIPCounts 17 ,CONVERT(VARCHAR(20),B.ShoppingVIPCounts) AS 消费会员数-- ShoppingVIPCounts 18 ,CONVERT(VARCHAR(20),ROUND(CONVERT(NUMERIC,C.TotalSaleAmount),0)) AS 总销售额-- TotalSaleAmount 19 ,CONVERT(VARCHAR(20),ROUND(CONVERT(NUMERIC,D.VIPSaleAmount),0)) AS 会员销售-- VIPSaleAmount 20 ,CONVERT(VARCHAR(20),E.VIPBillCounts) AS 会员小票数-- VIPBillCounts 21 ,CONVERT(VARCHAR(20),F.TotalBillCounts) AS 总小票数--TotalBillCounts 22 ,CONVERT(VARCHAR(20),G.FirstBuyCounts) AS 初次购买会员数 23 ,非会员小票数=CONVERT(VARCHAR(20),(F.TotalBillCounts-E.VIPBillCounts) ) 24 ,会员销售比重=CONVERT(VARCHAR(20),CONVERT(VARCHAR(20),ROUND(CONVERT(FLOAT,(D.VIPSaleAmount/C.TotalSaleAmount)),3)*100)+\'%\') 25 ,非会员小票客单价=CONVERT(VARCHAR(20),ROUND(CONVERT(NUMERIC,((C.TotalSaleAmount-D.VIPSaleAmount)/(F.TotalBillCounts-E.VIPBillCounts))),0)) 26 ,会员小票客单价=CONVERT(VARCHAR(20),ROUND(CONVERT(NUMERIC,(D.VIPSaleAmount/E.VIPBillCounts)),0)) 27 ,会员小票数占比=CONVERT(VARCHAR(20),CONVERT(VARCHAR(20),ROUND(CONVERT(FLOAT,(CONVERT(NUMERIC,E.VIPBillCounts)/CONVERT(NUMERIC,F.TotalBillCounts))),3)*100)+\'%\') 28 ,初次购买会员数占比=CONVERT(VARCHAR(20),CONVERT(VARCHAR(20),ROUND(CONVERT(FLOAT,(CONVERT(NUMERIC,G.FirstBuyCounts)/CONVERT(NUMERIC,B.ShoppingVIPCounts))),3)*100)+\'%\') 29 FROM #T1 A 30 JOIN #T2 B ON A.Date=B.Date 31 JOIN #T3 C ON B.Date=C.Date 32 JOIN #T4 D ON C.Date=D.Date 33 JOIN #T5 E ON D.Date=E.Date 34 JOIN #T6 F ON E.Date=F.Date 35 JOIN #T7 G ON F.Date=G.Date 36 )AS X 37 UNPIVOT ( 38 Data FOR [Week] 39 IN( 40 新注册会员,消费会员数,总销售额,会员销售,非会员小票客单价,非会员小票数 41 ,会员小票客单价,会员小票数 42 ,总小票数,会员销售比重,初次购买会员数,会员小票数占比,初次购买会员数占比 43 ) 44 )AS Y 45 ) AS p 46 PIVOT 47 ( 48 Max(p.Data) FOR [Date] IN([Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday],[Total]) 49 ) AS uu 50
View Code
版权声明:本文为zhangxs原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。