形式1
形式2
形式3
  有时候可能会有这样的需求: 将一张表的所有列名转做为数据的一列数据,将一列数据作为整张表的列名
当列比较多时,只用PIVOT是解决不了的,经过研究,需要将UNPIVOT 和 PIVOT 联合使用
  如上面的3个图,我们最终需要把形式1转换为形式3. 然而单用PIvot 解决不了问题,需要分两步转换
第一步:先通过UNPIVOT将所有列转换到数据中的一列,如形式2
第二步:通过PIVOT将另外一列数据作为列名
这样就实现了将源表的某列数据与列名互换.

 SELECT [Week] AS [Date],[Total] AS WeeklyTotal
,[Monday]
,[Tuesday]
,[Wednesday]
,[Thursday]
,[Friday]
,[Saturday]
,[Sunday]
FROM
(
SELECT [Date],Data,[Week]
FROM
(
SELECT A.Date
--CONVERT(VARCHAR(5),A.Date,101) AS [Date]
,CONVERT(VARCHAR(20),A.NewVIPCounts) AS 新注册会员-- NewVIPCounts
,CONVERT(VARCHAR(20),B.ShoppingVIPCounts) AS 消费会员数-- ShoppingVIPCounts
,CONVERT(VARCHAR(20),ROUND(CONVERT(NUMERIC,C.TotalSaleAmount),0)) AS 总销售额-- TotalSaleAmount
,CONVERT(VARCHAR(20),ROUND(CONVERT(NUMERIC,D.VIPSaleAmount),0)) AS 会员销售-- VIPSaleAmount
,CONVERT(VARCHAR(20),E.VIPBillCounts) AS 会员小票数-- VIPBillCounts
,CONVERT(VARCHAR(20),F.TotalBillCounts) AS 总小票数--TotalBillCounts
,CONVERT(VARCHAR(20),G.FirstBuyCounts) AS 初次购买会员数
,非会员小票数=CONVERT(VARCHAR(20),(F.TotalBillCounts-E.VIPBillCounts) )
,会员销售比重=CONVERT(VARCHAR(20),CONVERT(VARCHAR(20),ROUND(CONVERT(FLOAT,(D.VIPSaleAmount/C.TotalSaleAmount)),3)*100)+'%')
,非会员小票客单价=CONVERT(VARCHAR(20),ROUND(CONVERT(NUMERIC,((C.TotalSaleAmount-D.VIPSaleAmount)/(F.TotalBillCounts-E.VIPBillCounts))),0))
,会员小票客单价=CONVERT(VARCHAR(20),ROUND(CONVERT(NUMERIC,(D.VIPSaleAmount/E.VIPBillCounts)),0))
,会员小票数占比=CONVERT(VARCHAR(20),CONVERT(VARCHAR(20),ROUND(CONVERT(FLOAT,(CONVERT(NUMERIC,E.VIPBillCounts)/CONVERT(NUMERIC,F.TotalBillCounts))),3)*100)+'%')
,初次购买会员数占比=CONVERT(VARCHAR(20),CONVERT(VARCHAR(20),ROUND(CONVERT(FLOAT,(CONVERT(NUMERIC,G.FirstBuyCounts)/CONVERT(NUMERIC,B.ShoppingVIPCounts))),3)*100)+'%')
FROM #T1 A
JOIN #T2 B ON A.Date=B.Date
JOIN #T3 C ON B.Date=C.Date
JOIN #T4 D ON C.Date=D.Date
JOIN #T5 E ON D.Date=E.Date
JOIN #T6 F ON E.Date=F.Date
JOIN #T7 G ON F.Date=G.Date
)AS X
UNPIVOT (
Data FOR [Week]
IN(
新注册会员,消费会员数,总销售额,会员销售,非会员小票客单价,非会员小票数
,会员小票客单价,会员小票数
,总小票数,会员销售比重,初次购买会员数,会员小票数占比,初次购买会员数占比
)
)AS Y
) AS p
PIVOT
(
Max(p.Data) FOR [Date] IN([Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday],[Total])
) AS uu

多列的行列转换(PIVOT,UNPIVOT)的更多相关文章

  1. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  2. SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  3. SQL Server中行列转换 Pivot UnPivot

    PIVOT用于将列值旋转为列名(即行转列),在SQLServer 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列)FOR 列 in (-) )AS P 完 ...

  4. SQLServer中行列转换Pivot UnPivot

    PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P ...

  5. 【转】Spark实现行列转换pivot和unpivot

    背景 做过数据清洗ETL工作的都知道,行列转换是一个常见的数据整理需求.在不同的编程语言中有不同的实现方法,比如SQL中使用case+group,或者Power BI的M语言中用拖放组件实现.今天正好 ...

  6. sql行列转换PIVOT与unPIVOT

    基本语法 select * from Mould pivot ( count(ID)for ProductTypeCode in ( [FC], [RCU], [RCD] )) as PVT; wit ...

  7. 通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)

    在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一.MSsqlserver中我们通常的用法 1.Sqlserver数据库测试 ---创建测试表 Create tab ...

  8. SQL中行列转换Pivot

    --建表 ),课程 ),分数 int) --插入数据 ) ) ) ) ) ) 1.静态行转列(确定有哪些列) select 姓名, end)语文, end)数学, end)物理 from tb gro ...

  9. 行列转换 pivot

    select * from ( select isnull(c.type,'其他') type,d from ( select ID,Record_code,code,day(thedate) d f ...

随机推荐

  1. Android Studio 运行、编译卡死的解决办法

    Android stuido作为google主推的IDE,配合gradle编译,有很多的优点和便捷性.唯一使用过程中不舒服的地方就是莫名其妙的卡顿,经常在Gradle Build的时候卡死强制重启电脑 ...

  2. 在前台运行Service

    一个前台的 service是被用户强烈关注的从而不会在内存低时被系统杀死.前台 service必须在状态栏上提供一个通知,这个通知被放在"正在进行"区域中,这表示这个通知不能被解除,除非服务停止了或者 ...

  3. Android日志框架darks-logs使用教程

    一.配置文件 在使用darks-logs之前,我们需要为它创建一个名叫logd.properties的配置文件.如果你是需要在JAVA或WEB上使用该组件,那么你可以像配置log4j一样将它放在cla ...

  4. [LeetCode#84]Largest Rectangle in Histogram

    Problem: Given n non-negative integers representing the histogram's bar height where the width of ea ...

  5. 【转】Android Fragment 基本介绍--不错

    原文网址:http://www.cnblogs.com/mengdd/archive/2013/01/08/2851368.html Fragment Android是在Android 3.0 (AP ...

  6. [转载] cookie、JS记录及跳转到页面原来的位置

    额....如下 <!-- 定位页面的 Cookie function SetCookie(sName, sValue) { date = new Date(); s = date.getDate ...

  7. Linux学习笔记19——信号2

    上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数. 一  sigaction函数的作用 定义在接收 ...

  8. Hibernate(八)一对多单向关联映射

    上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射, 这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按 照我们的 ...

  9. 把测试app打包成ipa文件

    我终于把我的程序放到我的touch上了,其实把app放到touch上还有很多办法,这篇教程是主要讲怎么把app注册了,然后打包成一个ipa文件的. 先上官方文档:https://developer.a ...

  10. StoryBoard 的使用

    简单入门: http://my.oschina.net/plumsoft/blog/53886 详细操作:http://www.cnblogs.com/buro79xxd/archive/2012/0 ...