PIVOT运算符使用(动态行转列)
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运算符使用(动态行转列)的更多相关文章
- [MSSQL]採用pivot函数实现动态行转列
环境要求:2005+ 在日常需求中常常会有行转列的事情需求处理.假设不是动态的行,那么我们能够採取case when 罗列处理. 在sql 2005曾经处理动态行或列的时候,通常採用拼接字符串的方法处 ...
- 中等难度SQL语句(存储过程,分页,拼接字段、游标,日期类型转换,动态行转列,视图)汇总
一.创建存储过程 if Exists(select name from sysobjects where NAME = 'sp1LoginUser' and type='P')drop procedu ...
- 【转】MySQL存储过程中使用动态行转列
MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...
- MySQL 行转列 -》动态行转列 -》动态行转列带计算
Pivot Table Using MySQL - A Complete Guide | WebDevZoomhttp://webdevzoom.com/pivot-table-using-mysql ...
- mybatis 动态行转列
SELECT user_name , MAX(CASE course WHEN '数学' THEN score END ) 数学, MAX(CASE course WHEN '语文' THEN sco ...
- MySQL存储过程的动态行转列
MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- PHP 循环
PHP 中的循环语句用于执行相同的代码块指定的次数. 循环 在您编写代码时,您经常需要让相同的代码块运行很多次.您可以在代码中使用循环语句来完成这个任务. 在 PHP 中,我们可以使用下列循环语句: ...
- OpenERP 的XML-RPC的轻度体验+many2many,one2many,many2one创建方式
来自:http://cn.openerp.cn/openerp_import_image_by_xmlrpc/ 每当夏秋之交,我们都有展会,展会完后,都有很多的新的潜在客户要添加,我们收了一大堆名片, ...
- Eclipse 如何导入web项目
Eclipse 如何导入web项目 CreateTime--2018年3月8日09:07:16 Author:Marydon 方法一:推荐使用 1.将web项目手动拷贝到Eclipse的工作空间下 ...
- Linux系统CentOS6.2版本下安装JDK7详细过程
Linux系统CentOS6.2版本下安装JDK7详细过程 分类: Linux 2014-08-25 09:17 1933人阅读 评论(0) 收藏 举报 前言: java 是一种可以撰写 ...
- spyder python 相关
1.python开发集成工具Spyder中,如何设置变量成员提示和代码补全呢? 答: pip install rope,安装好rope 就可以了 2.最常用的是:tap的制动补全 (IPython c ...
- Golang配置文件解析-oozgconf
代码地址如下:http://www.demodashi.com/demo/14411.html 简介 oozgconf基于Golang开发,用于项目中配置文件的读取以及加载,是一个轻量级的配置文件工具 ...
- 编译 boost
不想深究,只是可以编译出想要的lib文件 1.打开visual studio 2012 命令提示 2.进入 boost目录 3.运行booststrp.bat得到b2.exe.bjam.exe.pro ...
- vi/vim 查找替换使用方法
http://wzgyantai.blogbus.com/logs/28117977.html vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记 ...
- android直接读取项目中的sqlite数据库
最近项目中要实现android读取sqlite数据库文件,在这里先做一个英汉字典的例子.主要是输入英语到数据库中查询相应的汉语意思,将其答案输出.数据库采用sqlite3. 如图: 实现过程完全是按照 ...
- yaml语法三大规则
规则一:缩进 yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack需要每个缩进级别由两个空格组成.一定不能使用tab键 规则二:冒号 yaml: mykey: my_value 每 ...