Sql Server 列转行 Pivot使用
今天正好做 数据展示,用到了列转行,行转列有多种方式,Pivot是其中的一种,Povit 是sql server 2005以后才出现的功能,
下面的业务场景:
每个月,进货渠道的总计数量【Total】,有中文,英文年月,等数据列,
原始数据如下:
需求:
需要把数据按每一年的1月到12月展示成一行,如上图,怎么办?Povit排上用场了
有的年,可能不是每个月都有,也就是动态列的生成了。
首先要做的就是构建1到12月,
DECLARE @temp NVARCHAR(max)=''
SELECT @temp=COALESCE(@temp,'')+ '['+ Monthly+'],'
FROM
(SELECT DISTINCT Monthly FROM [DMS_SourceofBusiness]
WHERE Yearly=''
) a
set @temp=SUBSTRING(@temp,1,LEN(@temp)-1)
查询一下是否生成了呢?
SELECT @temp
果然如此,
下一步就是把这些动态列作为生成数据的列,
DECLARE @sql NVARCHAR(max)=''
SET @sql='
SELECT Source,Yearly'+@temp+' from
(SELECT Source,Yearly,Monthly,Total FROM [dbo].[DMS_SourceofBusiness])c
pivot( MAX(Total)for Monthly IN('+ @temp+'
))b
where Yearly='''' and Source like''%Customer walk-in%''
'
PRINT @sql
EXEC(@sql)
执行之后,就如上面的的预期的显示结果一样了,
注意:
Pivot语法结构:
Pivot (A) for B in(C)
A:Max(Total),表示要显示的合计值,
B:Monthly,原始数据的列头,就是要把它的数据转化为列的字段的名字
C:动态列
-------------------------
方案二:
也可以用case when 来解决,但是这样的动态的列就会变成固定的列,
应用场景:月份:1-12个月,星期(周一到周天),季度(Q1到Q4)等等
代码如下:
SELECT RTRIM(LTRIM(SOB.Source))Source,SOB.Yearly,
MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) AS 'M01'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M02'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M03'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M04'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M05'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M06'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M07'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M08'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M09'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M10'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M11'
,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='' THEN SOB.Total ELSE 0 END ) 'M12'
FROM [dbo].[DMS_SourceofBusiness] SOB WITH(NOLOCK)
WHERE SOB.Yearly =''
GROUP BY Source,SOB.Yearly
显示数据格式:
总结:
根据不同的类型选择不同的解决方法,
使用Pivot是比较通用的一种方式,但是写sql或者存储过程,稍稍复杂一些。
Sql Server 列转行 Pivot使用的更多相关文章
- (转)SQL Server 列转行
原文:http://www.myexception.cn/sql-server/1078985.html1,2,3,4,5以上是一个字符串或则一逗号分隔的数字. 这里希望用一条语句查询出这样的效果: ...
- sql server列转行的几种方法
方法一,临时变量: declare @temp nvarchar(max)='' select @temp=coalesce(@temp,'')+Location+',' from( select d ...
- SQL Server 列存储索引强化
SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...
- 使用Spark加载数据到SQL Server列存储表
原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...
- SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行
ylbtech-SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列 ...
- 列转行pivot函数在SQL Sever里面和Oracle里面的用法区别
首先pivot是一个列转行的函数,反向用是unpivot(行转列). 在SQL sever中可以这么写 SELECT * FROM [TABLE] /*数据源*/ AS A PIVOT ( MAX/* ...
- SQL Server中使用PIVOT行转列
使用PIVOT行转列 1.建表及插入数据 USE [AdventureDB] GO /****** Object: Table [dbo].[Score] Script Date: 11/25/201 ...
- SQL 行转列 列转行 PIVOT UNPIVOT
1.基础表 2.行转列,注意ISNULL函数的使用,在总成绩的统计中,ISNULL(-,0) 有必要使用 3.列转行,对列语文.数学.英语.政治,进行列转行,转为了2列,score scname 这两 ...
- SQl 行转列,列转行 (PIVOT,UPIVOT)
1.列转行 表t_pivot 转后效果 方法 1 (常用方法 case when) SELECT buydate, SUM(CASE WHEN type = '生活' THEN typec ...
随机推荐
- hdu 1690 The Balance_母函数
题意:给你n个数,这些数可以互相加或者减,输出在范围[1,sum]里不能通过运算得出的数 思路:套母函数模版 #include <iostream> #include<cstdio& ...
- lamp apache配置虚拟主机
You don't have permission to access /index.php on this server
- Linux 零碎知识点
ln -s ../libs/ libs 在当前目录下建立一个符号链接文件libs,使它指向上一层目录的libs文件夹 关于su和su -的区别切换用户是可以使用su tom或者su - tom来实现, ...
- 网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态_第6单元作业【2】- 在线编程(难度:中)
第6单元作业[2]- 在线编程(难度:中) 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...
- hdu 4521 线段树改点求点的应用
小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- Endian.BIG_ENDIAN和Endian.LITTLE_ENDIAN(http://smartblack.iteye.com/blog/1129097)
Endian.BIG_ENDIAN和Endian.LITTLE_ENDIAN 在ByteArray和Socket中,能看到一个属性endain. endian : String 更改或读取数据的字节顺 ...
- js 正则表达式验证 整理
1.验证首字符是英文字母: var str="123"; var reg=/^[a-zA-Z]/; if(!reg.test(str)){ alert(str+"应以字母 ...
- An error has occurred,See error log for more details
解决Eclipse3.2配合MyEclipse5.0M2使用时打开JSP发生“An error has occurred,See error log for more details”错误的解决方法 ...
- Android ListView滑动底部自动加载更多
直接上代码: // lv = (ListView) findViewById(R.id.lv); // // for(int i = 0;i < 50;i++){ // ls.add(" ...
- Android Webview与Html5交互
转:http://fangjie.info/?p=417#more-417 一.WebView.setWebViewClient(new MyWebViewClient()); 1.public ...