形式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 进入另外一个窗体的两种方法

    方法一: Intent intent = new Intent(); intent.setClassName(this, "com.wuyou.twoactivity.OtherActivi ...

  2. vs2010编译curl为static库及测试

    1,编译curl为static库 用vs2010打开: curl-7.32.0\vs\vc6\vc6curl.dsw 选择LIB Release生成libcurl静态库: curl-7.32.0\vs ...

  3. EntityFramework 异常 -- An entity object cannot be referenced by multiple instances of IEntityChangeTracker

    问题      在调用 DbSet 的 Attach()  方法时(与将 Entity 设置为 EntityState.Unchanged 状态等价)报告以下错误:      An entity ob ...

  4. [LeetCode#116]Fraction to Recurring Decimal

    Problem: Given two integers representing the numerator and denominator of a fraction, return the fra ...

  5. Apache HBase RPC身份验证中间人安全措施绕过漏洞(CVE-2013-2193)

    漏洞版本: Apache Group HBase 0.94.x Apache Group HBase 0.92.x 漏洞描述: BUGTRAQ ID: 61981 CVE(CAN) ID: CVE-2 ...

  6. Hibernate 以流的方式获取数据

    hibernateQuery.setFetchSize(Integer.MIN_VALUE); results = hibernateQuery.scroll(ScrollMode.FORWARD_O ...

  7. Asterisk 安装与配置

    如果用来管理 1.4 版本的 Asterisk ,可能会存在未知的问题.通过集成 CentOS . Asterisk 和 FreePBX , Fonality 公司提供了一个完全傻瓜式的 Asteri ...

  8. Java Struts2 的请求处理流程详解

    一.Struts2的处理流程: 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是 ...

  9. java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误

    /** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...

  10. C# 操作配置文件

    1.配置文件app.config的书写: string mdbPath = ConfigurationManager.AppSettings["mdbPath"].ToString ...