今天正好做 数据展示,用到了列转行,行转列有多种方式,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使用的更多相关文章

  1. (转)SQL Server 列转行

    原文:http://www.myexception.cn/sql-server/1078985.html1,2,3,4,5以上是一个字符串或则一逗号分隔的数字. 这里希望用一条语句查询出这样的效果: ...

  2. sql server列转行的几种方法

    方法一,临时变量: declare @temp nvarchar(max)='' select @temp=coalesce(@temp,'')+Location+',' from( select d ...

  3. SQL Server 列存储索引强化

    SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...

  4. 使用Spark加载数据到SQL Server列存储表

    原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...

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

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

  6. 列转行pivot函数在SQL Sever里面和Oracle里面的用法区别

    首先pivot是一个列转行的函数,反向用是unpivot(行转列). 在SQL sever中可以这么写 SELECT * FROM [TABLE] /*数据源*/ AS A PIVOT ( MAX/* ...

  7. SQL Server中使用PIVOT行转列

    使用PIVOT行转列 1.建表及插入数据 USE [AdventureDB] GO /****** Object: Table [dbo].[Score] Script Date: 11/25/201 ...

  8. SQL 行转列 列转行 PIVOT UNPIVOT

    1.基础表 2.行转列,注意ISNULL函数的使用,在总成绩的统计中,ISNULL(-,0) 有必要使用 3.列转行,对列语文.数学.英语.政治,进行列转行,转为了2列,score scname 这两 ...

  9. SQl 行转列,列转行 (PIVOT,UPIVOT)

    1.列转行 表t_pivot 转后效果   方法 1 (常用方法 case when) SELECT     buydate, SUM(CASE WHEN type = '生活' THEN typec ...

随机推荐

  1. 推荐一款JavaScript日历控件:kimsoft-jscalendar

    一.什么是 kimsoft-jscalendar     一个简洁的avaScript日历控件,可在Java Web项目,.NET Web 项目中使用 二.kimsoft-jscalendar 有什么 ...

  2. mongodb导出命令

    ./mongoexport -d admin -c col -o col.json 找到了 导出所有数据库的 http://www.jb51.net/article/52498.htm

  3. Unity 之 AfterFixedUpdate,在所有 GameObject FixedUpdate 后执行

    目的 FixedUpdate 在不同的 GameObject 互相之间是没有执行顺序的,我们并不能知道哪个 GameObject 先执行 FixedUpdate. 但是,有的时候我们仍然希望某个 Ga ...

  4. C#调用HTTP接口

    string url = "http://www.***.com?id=123&username=test&userpwd=*****"; WebRequest w ...

  5. Javascript 【JSON对象】

    var box = JSON.parse(json);     //将字符串解析为JSON var json = JSON.stringify(box);    //讲JSON转换为字符串 var b ...

  6. javascript 的对象

    所有事物都是对象 JavaScript 提供多个内建对象,比如 String.Date.Array 等等. 对象只是带有属性和方法的特殊数据类型. 布尔型可以是一个对象. 数字型可以是一个对象. 字符 ...

  7. Android布局(一)layout_gravity 属性和 gravity属性的区别

    安卓中的 layout_gravity 属性和 gravity属性 有啥区别? LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravi ...

  8. c#简单缓存使用,添加和修改

    private void SetCache(string CacheKey, object objObject, DateTime dt) { System.Web.Caching.Cache obj ...

  9. [Linked List]Linked List Cycle,Linked List Cycle II

    一.Linked List Cycle Total Accepted: 85115 Total Submissions: 232388 Difficulty: Medium Given a linke ...

  10. 编译安装apache2.4

    一.编译安装apache2.4Apache官方说:与Apache 2.2.x相比,Apache 2.4.x提供了很多性能方面的提升,包括支持更大流量.更好地支持云计算.利用更少的内存处理更多的并发等. ...