PIVOT运算符用于在列和行之间对数据进行旋转或透视转换,同时执行聚合运算

官方的语法如下:

PIVOT(

聚合函数(value_column)

FOR pivot_column

IN(<column_list>)

)

我这边有一个保存网站下所有子域名PV的表PV_Test,数据如下

现在要查询每个域名下不同日期的PV

SQL代码如下

 DECLARE
--保存最终执行的SQL语句
@strSql nvarchar(1000),
--定义变量保存要转化为列的数据
@Date nvarchar(500)
--赋值 很重要,不赋值执行没结果
SET @Date=''
--赋值 把所有要转化为列的数据保存在字符串中,并且以逗号分隔
SELECT @Date=@Date+CDate FROM (SELECT DISTINCT '['+CONVERT(varchar(10), CDate, 23)+'],' AS CDate FROM PV_Test) AS T1
--打印@Date
PRINT(@Date)
--去掉末尾的一个逗号
SET @Date=SUBSTRING(@Date,1,LEN(@Date)-1)
--使用PIVOT运算符转化
SET @strSql= 'SELECT * FROM (SELECT Domain,CONVERT(varchar(10), CDate, 23) AS RQ,PV FROM dbo.PV_Test) AS a PIVOT(SUM(PV) FOR RQ IN ('+@Date+') ) AS b'
--打印最终执行的SQL
PRINT(@strSql)
--执行sql
EXEC (@strSql)

备注已经写得很清楚了,执行结果如下

可以清楚的看到每个域名下各个日期的PV情况

如果要把上面的NULL值转为0,使用下面的语句:

DECLARE
--保存最终执行的SQL语句
@strSql nvarchar(max),
--定义变量保存要转化为列的数据
@ColumnName nvarchar(max),
@ColumnNameWithIsNull NVARCHAR(max)
--赋值 很重要,不赋值执行没结果
SET @ColumnName=''
SET @ColumnNameWithIsNull=''
--赋值 把所有要转化为列的数据保存在字符串中,并且以逗号分隔
SELECT @ColumnName=@ColumnName + ColumnName FROM
(
SELECT DISTINCT '['+ ColumnName +'],' AS ColumnName,SequenceID
FROM [CustomizedReport].[ColumnList]
) AS T1
ORDER BY T1.SequenceID SELECT @ColumnNameWithIsNull=@ColumnNameWithIsNull + ColumnName FROM
(
SELECT DISTINCT 'ISNULL(['+ ColumnName +'],0) as ['+ ColumnName +'],' AS ColumnName,SequenceID
FROM [CustomizedReport].[ColumnList]
) AS T1
ORDER BY T1.SequenceID
--打印@ColumnName
PRINT(@ColumnName)
PRINT(@ColumnNameWithIsNull)
--去掉末尾的一个逗号
SET @ColumnName=LEFT(@ColumnName,LEN(@ColumnName)-)
SET @ColumnNameWithIsNull=LEFT(@ColumnNameWithIsNull,LEN(@ColumnNameWithIsNull)-)
--使用PIVOT运算符转化
SET @strSql= 'SELECT CompanyID,EmployeeID,'+ @ColumnNameWithIsNull +' FROM (SELECT CompanyID,EmployeeID,ColumnName,Shares FROM [CustomizedReport].[VerticalResult]) AS a PIVOT(max(Shares) FOR ColumnName IN ('+@ColumnName+') ) AS b'
--打印最终执行的SQL
PRINT(@strSql)
--执行sql
EXEC (@strSql)

PIVOT运算符使用(动态行转列)的更多相关文章

  1. [MSSQL]採用pivot函数实现动态行转列

    环境要求:2005+ 在日常需求中常常会有行转列的事情需求处理.假设不是动态的行,那么我们能够採取case when 罗列处理. 在sql 2005曾经处理动态行或列的时候,通常採用拼接字符串的方法处 ...

  2. 中等难度SQL语句(存储过程,分页,拼接字段、游标,日期类型转换,动态行转列,视图)汇总

    一.创建存储过程 if Exists(select name from sysobjects where NAME = 'sp1LoginUser' and type='P')drop procedu ...

  3. 【转】MySQL存储过程中使用动态行转列

    MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...

  4. MySQL 行转列 -》动态行转列 -》动态行转列带计算

    Pivot Table Using MySQL - A Complete Guide | WebDevZoomhttp://webdevzoom.com/pivot-table-using-mysql ...

  5. mybatis 动态行转列

    SELECT user_name , MAX(CASE course WHEN '数学' THEN score END ) 数学, MAX(CASE course WHEN '语文' THEN sco ...

  6. MySQL存储过程的动态行转列

    MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...

  7. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  8. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  10. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. STL - 容器 - Map(二)

    把Map用作关联式数组 MapAdvanceTest.cpp #include <map> #include <string> #include <iostream> ...

  2. Linux系统重装与还原

    当初第一次装ubuntu系统时,对文件系统的构成还不太了解,所以在分区的时候给home的分区特别小,导致后期软件都装不进去.说磁盘已满.所以想对系统又一次分区. 上网找了资料,都说用GParted这个 ...

  3. 解决RMI 客户端异常no security manager: RMI class loader disabled

    解决方法: 客户端和服务端的Service包名改一致 ok!!

  4. Tomcat启动时选择加载项目

    到tomcat\conf\Catalina\localhost下新建文件:myapp.xml 内容如下: <Context path="/myapp" docBase=&qu ...

  5. eclipse 如何运行mavenWeb项目

      1.使用maven 首先,在eclipse中,使用maven对项目进行打包: 其次,将项目发布到Tomcat服务器上 说明: demo_WebService2-0.0.1-SNAPSHOT文件夹存 ...

  6. HTTP协议是如何通信的

    一.什么是HTTP协议 HTTP协议是HyperText Transfer Protocol的缩写,即超文本传输协议.是由w3c(万维网联盟)制定的一种应用层协议,用来定义浏览器与web服务器之间如何 ...

  7. 在C#中判断某个类是否实现了某个接口

    有时我们需要判断某个类是否实现了某个接口(Interface),比如在使用反射机制(Reflection)来查找特定类型的时候. 简单来说,可以使用Type.IsAssignableFrom方法: t ...

  8. Centos调出图形化的网络管理

    在Linux中设置网路,图形化很方便.在命令行下/etc/sysconfig/network-scripts/ifcfg-eth0 00.命令行下修正网路 [root@dzswj-test ~]#ca ...

  9. 微软 Visual Studio 2017 中文正式版下载 – 免费社区版/专业版/企业版

    作为“宇宙最强”的集成开发环境 IDE,微软的 Visual Studio 不仅破天荒发布了 macOS 版本,如今终于也推出了其 Windows 的最新版本—— VS 2017 正式版了.这对开发者 ...

  10. 判断是否为SIM卡联系人

    判断是否为SIM卡联系人 在AsyncQueryContacts类中. private List<TxrjAccount> accounts = new ArrayList<Txrj ...