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 ...
随机推荐
- 吐槽下CSDN编辑器
Perface 近期喜欢上了markdown,我认为它就是一些HTML标签的快捷键,用一些符号来取代标签,易学易读易用,何乐而不为呢?近期也喜欢用印象笔记来让我的记忆永存,确实它强大的收集能力让我迷上 ...
- R-plot
颜色.图例和线 在散点图中添加信息.图例以及回归线. 模拟数据 #模拟数据 dat <- data.frame(X = runif(100,-2,2),T1 = gl(n=4,k=25,labe ...
- 【概率DP入门】
http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html 有关概率和期望问题的研究 摘要 在各类信息学竞赛中(尤其是ACM竞赛中) ...
- querySelectorAll
<!DOCTYPE html><html><body> <div id="query">第一个</div> <di ...
- An Data-Scientist Prepares 《数据科学家的自我修养》
从今天开始,博主将用大概1000天的时间记录自己学习并成为初级数据科学家(数据分析师)的心路历程. 包括数据科学家所必需的的基础知识:数学,统计,计算机,商业,沟通能力等. 希望博主能够在2017前完 ...
- STM32学习笔记之一(初窥STM32)
怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...
- Three.js学习笔记 – “我和小伙伴都惊呆了”的特效和Three.js初探
什么是Three.js three.js是JavaScript编写的WebGL第三方库.提供了非常多的3D显示功能.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包 ...
- Spring随笔 - 事务隔离级别
Spring提供5中事务隔离级别: ISOLATION_DEFAULT:使用数据库后端的默认隔离级别. ISOLATION_READ_UNCOMMITTED:允许读取尚未提交的数据变更.可能会导致脏读 ...
- 关于使用HttpSessionBindingListener获取在线用户数,同一用户登陆一次
原创地址:http://blog.csdn.net/jiaoxueli/article/details/2226134 考虑到项目中统计在线用户数量和同一用户只能登陆一次的需求,查询联系 HttpSe ...
- PHP开发调试环境配置
——基于wamp和Eclipse for PHP Developers 引言 为了搭建PHP开发调试环境,我曾经在网上查阅了无数的资料,但没有一种真正能够行的通的.因为PHP开发环境需要很多种软件相互 ...