今天正好做 数据展示,用到了列转行,行转列有多种方式,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. 1、什么是Lucene,Lucene能干什么

    1.什么是lucene  Lucene是一个全文搜索框架,而不是应用产品.因此它并不像http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让 ...

  2. web api 上传

    using System.Net; using System.Net.Http; using System.Web; using System.Web.Http;   namespace FileUp ...

  3. nyoj 523 亡命逃窜 【BFS】

    亡命逃窜 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 从前有个叫hck的骑士,为了救我们漂亮的公主,潜入魔王的老巢,够英雄吧.只是英雄不是这么好当的.这个可怜的娃 ...

  4. nagios插件之监控if8接口日志(新接口)

    vi check_if8_log.c #include <stdio.h> #include <stdlib.h> #include <string.h> #inc ...

  5. java 命令行制定logback参数

    -Dlogback.configurationFile=file:///export/Workspace/apache-cassandra/apache-cassandra-main/target/b ...

  6. Gradle中文乱码

    代码中的中文注释可能会引起Gradle报错 解决办法: 在项目下的build.gradle下添加以下代码即可解决 [java] view plaincopyprint? tasks.withType( ...

  7. Android中 Http请求

    HttpClient public class MainActivity extends Activity { private Button button; @Override protected v ...

  8. 常用WebService收集

    尊重原著作:本文转载自http://www.cnblogs.com/tianguook/archive/2010/09/29/1838469.html 天气预报Web服务,数据来源于中国气象局Endp ...

  9. JavaScript里面三个等号和两个等号的区别

    == equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 下面分别说明: 先说 ===,这个 ...

  10. Reset Password Functionality FAQ

    In this Document   Purpose   Questions and Answers   How can users request a password reset?   How d ...