博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql Server 列转行 Pivot使用
阅读量:5892 次
发布时间:2019-06-19

本文共 2241 字,大约阅读时间需要 7 分钟。

 

今天正好做 数据展示,用到了列转行,行转列有多种方式,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='2006') aset @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=''2006'' and Source like''%Customer walk-in%'''PRINT @sqlEXEC(@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)='01' THEN SOB.Total ELSE 0 END  ) AS 'M01' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='02' THEN SOB.Total ELSE 0 END  ) 'M02' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='03' THEN SOB.Total ELSE 0 END  ) 'M03' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='04' THEN SOB.Total ELSE 0 END  ) 'M04' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='05' THEN SOB.Total ELSE 0 END  ) 'M05' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='06' THEN SOB.Total ELSE 0 END  ) 'M06' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='07' THEN SOB.Total ELSE 0 END  ) 'M07' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='08' THEN SOB.Total ELSE 0 END  ) 'M08' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='09' THEN SOB.Total ELSE 0 END  ) 'M09' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='10' THEN SOB.Total ELSE 0 END  ) 'M10' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='11' THEN SOB.Total ELSE 0 END  ) 'M11' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='12' THEN SOB.Total ELSE 0 END  ) 'M12'  FROM [dbo].[DMS_SourceofBusiness] SOB WITH(NOLOCK)WHERE SOB.Yearly ='2015'GROUP BY Source,SOB.Yearly

显示数据格式:

 

总结:

根据不同的类型选择不同的解决方法,

使用Pivot是比较通用的一种方式,但是写sql或者存储过程,稍稍复杂一些。

转载于:https://www.cnblogs.com/flydragon0815/p/4483029.html

你可能感兴趣的文章
ITIL工具系列之CA-Unicenter
查看>>
数据库状态检查
查看>>
JAVAEE5 JAVAEE6 JAVAEE7规范列表
查看>>
perl学习笔记(4)
查看>>
游戏炮打飞机设计——计算机达人成长之路(11)连载
查看>>
python linecache模块读取文件用法详解
查看>>
snort日志分析和管理工具(转贴)
查看>>
Powershell管理系列(二十七)PowerShell操作之修改AD自定义属性
查看>>
PECL 与 phpize
查看>>
写段QTP脚本与大家一起分享
查看>>
Windows XP/2003系统服务详解
查看>>
Ibatis的namespace和缓存
查看>>
3集群-企业级 Hyper-v 群集部署实验方案
查看>>
读懂 Deployment YAML - 每天5分钟玩转 Docker 容器技术(125)
查看>>
分享我做的nginx+keepalived做的主主架构(一)
查看>>
XP系统怎样锁定计算机
查看>>
Some tips about crawling large external data with bcs connector
查看>>
RHCE学习<1>RHEL6系统安装、安装VM Tools和配置YUM本地源
查看>>
Web Client Software Factory系列(2):Composite Web应用程序块
查看>>
Exchange Server 2007系列之二:管理工具简介
查看>>