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 ...
随机推荐
- iOS断言
来自:http://my.oschina.net/panyong/blog/205573 在看到xmpp项目中的一些代码时,看到如下,不懂该代码是啥意思, 如下: NSAssert(_xmppStre ...
- LSH、ITQ、SKLSH图像检索实验实现(包含源码下载地址)
原文来自我的独立blog:http://www.yuanyong.org/blog/cv/lsh-itq-sklsh-compliment 这两天寻找idea,想来思去也没想到好点的方法,于是把前段时 ...
- sql 中的 indexOf 与 lastIndexOf
DECLARE @Name NVARCHAR (50)SET @Name = '12345.67890ABCDE.FGHIJKLMNOPQRSTUVWXYZTest' DECLARE @Positio ...
- hdu 1279 验证角谷猜想(简单的模拟)
Problem Description 数论中有许多猜想尚未解决,其中有一个被称为“角谷猜想”的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何一个大于一的自然数, ...
- hdu 4393 Throw nails(STL之优先队列)
Problem Description The annual school bicycle contest started. ZL is a student in this school. He is ...
- C语言高速入口系列(七)
C语言高速入口系列(七) C语言指针进阶 本章引言: 在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂, C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比方二 ...
- [代码]Java后台推送消息到IOS前端
PayLoad payLoad = new PayLoad(); payLoad.addAlert("test"); //手机端的提示消息 payLoad.addBadge( ...
- EXT属性
Extjs & Ext.Net 弹出整个浏览器对话框的方法 top.Ext.Msg.alert("值"); top.Ext.Msg.confirm("值" ...
- 远程访问数据库查询数据量一大就Hang
最近刚为客户升级了一套Oracle Database,一切进展顺利,眼看就要顺利验收时,发现有部分客户端软件连接新版本数据库时会Hang,问题非常诡异. 系统环境如下 升级前的环境OS:Windows ...
- [Linked List]Remove Duplicates from Sorted List II
Total Accepted: 59433 Total Submissions: 230628 Difficulty: Medium Given a sorted linked list, delet ...