Sql Server 列转行 Pivot使用
来源:互联网 发布:英汉翻译软件 编辑:程序博客网 时间:2024/05/22 06:58
今天正好做 数据展示,用到了列转行,列转行有多种方式,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:动态列 B的数据内容
-------------------------
方案二:
也可以用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或者存储过程,稍稍复杂一些。
0 0
- Sql Server 列转行 Pivot使用
- sql 行转列 PIVOT 列转行 UNPIVOT
- Sql Pivot行转列/列转行应用
- Sql Server使用游标实现列转行
- sql server 列转行
- sql server 列转行
- SQL Server 列转行
- SQL Server 2005之PIVOT/UNPIVOT行列转换(行转列、列转行)
- sqlserver2008 PIVOT列转行
- Pivot 多列转行
- pivot实现列转行
- SQL SERVER PIVOT使用
- SQL Server 2005 列转行
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
- SQL中PIVOT 行转列和UNPIVOT列转行实例讲解
- SQL中PIVOT 行转列和UNPIVOT列转行实例讲解
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
- SQL中PIVOT 行列转换;UNPIVOT列转行
- Linux find和grep命令来查找文件
- leetcode-39&40&216 Combination Sum I&II&III
- 类
- linux ssh 使用深度解析(key登录详解)
- MyEclipse连接MySQL的方法
- Sql Server 列转行 Pivot使用
- 关于Android资源的使用
- linux下查找文件的方法
- Transact-SQL中使用PATINDEX和STUFF替换字串中非数字字符
- 影像质量评价指标汇总
- Integer to Roman ——解题报告
- 单例模式
- 类模板——类模板的特化问题
- Android---36---读取SD卡内容