形式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 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhangxs/p/5338194.html