今天正好做 数据展示,用到了列转行,行转列有多种方式,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'
) 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])cpivot( MAX(Total)for Monthly IN('+ @temp+'
))b
where  Yearly=''2006'' 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)='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

Sql Server 列转行 Pivot使用相关推荐

  1. SQL Server 列转行的实现

    不管我们在平时的学习或工作中,难免会遇到列转行的数据操作,下面的例子可参考一下 1.我们先建表 drop table if exists stu_Score create table stu_Scor ...

  2. sql server列转行怎么提高效率_行转列、列转行

    1.行转列 所谓行转列,即将一行数据转成多行显示,或者说将多列数据转成一列显示.通常将转化后的列名为某一行中某一列的值,来识别原先对应的数据.具体如下: 通常的SQL实现用union来实现,如下.有些 ...

  3. SQL Server 2005之PIVOT/UNPIVOT行列转换

    SQL Server 2005之PIVOT/UNPIVOT行列转换 作者: NinGoo(http://ningoo.itpub.net) 发表于: 2007.04.18 11:49 分类: SQL ...

  4. SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行

    ylbtech-SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列 ...

  5. Sql server 行列转换 PIVOT UNPIVOT

    官方介绍链接 下面是SQL示例 drop table tb create table tb(name varchar(10),course varchar(10),score int,sex char ...

  6. mysql 列转行 unpivot_Spark SQL中列转行(UNPIVOT)的两种方法

    行列之间的互相转换是ETL中的常见需求,在Spark SQL中,行转列有内建的PIVOT函数可用,没什么特别之处.而列转行要稍微麻烦点.本文整理了2种可行的列转行方法,供参考. 测试数据准备 本文的环 ...

  7. csv逗号分隔值文件_如何将逗号分隔值(CSV)文件拆分为SQL Server列

    csv逗号分隔值文件 Receiving a comma delimited file is not new technology nor is it difficult to deal with i ...

  8. SQL Server列存储实现方案

    SQL Server从2012版本开始支持列存储,但2012版本使用列存储会导致表进入只读状态:2014版本使用可更新聚集列存储索引技术解决了只读的问题,使用列存储的表支持修改:2016版本列存储支持 ...

  9. isnull pivot server sql_使用SQL Server中的“Pivot”将行转换为列

    我正在编写一个可能对此有用的sp,基本上这个sp会旋转任何表并返回一个新的表,或仅返回数据集,这是执行它的方法: Exec dbo.rs_pivot_table @schema=dbo,@table= ...

最新文章

  1. 四川师范大学大学计算机基础,四川师范大学2009-2010学年计算机基础期末考试试题.doc...
  2. oracle 64位客户端_oracle的管理工具toad如何设置命令补全
  3. HD_2092整数解
  4. web前端技巧-ES6新特性与重点知识汇总(一)
  5. 当C++爬山壁纸——C++山寨版
  6. 人人开源项目文档_为什么图对于您的开源项目文档至关重要
  7. Nginx的主要函数调用关系分析
  8. 统计学习导论_统计学习导论 | 读书笔记11 | 多项式回归和阶梯函数
  9. 演示电脑小白安装windows11系统教程
  10. echarts环形图加边框
  11. signature=34db6f8e3cd9ad368186a42fa9bb3c02,ad.html
  12. SQLEXPRESS服务无法启动
  13. Win8 无法连接打网络打印机(HP LaserJ1010)
  14. 怎么用java打开.jar文件
  15. Domain Adaptation论文合集
  16. 难解次级债内乱 美国众议院反咬中国金融开放
  17. 侦探系列-照片隐藏信息提取
  18. 16、Android -- ListView 基础学习
  19. linuxptp源码研究
  20. 能量景观(Energy landscape)

热门文章

  1. Scrapy 轻松定制网络爬虫
  2. 在asp.net2.0中使用存储过程
  3. 线性插值改变图像尺寸_图像分割--gt;上采样的那些事
  4. oracle until freed,ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法...
  5. 电脑应用程序错误怎么办_遇到电脑桌面应用程序无法正常启动(0xc0000142)怎么办?0xc0000142解决方法...
  6. activate tensorflow_“量子固件”来了!利用 TensorFlow 提升量子计算硬件性能
  7. 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is
  8. 前端常用插件、工具类库汇总,新手必收藏!!!
  9. 2020年,我们该如何学习WEB 前端开发
  10. 对我国超级计算机的应用,要加强我国超级计算机应用人才储备