行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定;动态转换则为转换的行数不固定。

转换的方法一般采用case when语句或pivot(MSSQL 2005及以上版本)来实现。

首先来看静态转换:先准备一下测试数据,使用如下SQL语句直接生成:

If Exists (Select * From sysobjects Where
id = OBJECT_ID('Sales') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
    Begin
        Drop Table Sales
    End

Create Table Sales(
Name nvarchar(10),
Product nvarchar(12),
Quantity int)

Insert Into Sales(Name,Product,Quantity)
Values('Leo','Apple',300),
('Leo','Orange',23),
('Amy','Apple',432),
('Amy','Banana',45),
('Leo','Banana',74),
('Tomy','Apple',57),
('Tomy','Orange',92),
('Tim','Apple',76),
('Tim','Banana',45),
('Tim','Orange',159),
('Amy','Orange',610),
('Alice','Apple',245),
('Alice','Banana',342),
('Alice','Orange',138)
Go

运行后生成一个Sales表,数据如下:

现在要以商品名称(Product)的记录作为列,按照姓名来统计卖出的数量,如果某人未卖出某商品,则用“NULL”表示,即生成如下的格式:

分别用case when和pivot解决方法如下:

--case when方案
Select Name,
sum(Case When Product='Apple' Then Quantity Else NULL End) as Apple,
sum(Case When Product='Banana' Then Quantity Else NULL End) as Banana,
sum(Case When Product='Orange' Then Quantity Else NULL End) as Orange
From Sales
Group By Name

--pivot方案 sql 2005及以上版本
Select * From Sales
PIVOT
(
    SUM(Quantity) For Product in(Apple,Banana,Orange)
) as pvt

以上是静态方案,如果有一天商品又增加了strawberry,pear等,如果要实现之前的结果,按照上面的方案就又要手动去修改SQL语句,增加两种商品列,有没有一劳永逸的解决方案呢,答案当然有,就是动态SQL,结合上面的SQL语句可以看出,如果在case when中可以先找到所有的商品,然后循环生成case when语句就可以解决了;在pivot解决方案中只要将所有商品记录生成一个以“,”连接的字符串。

具体的实现语句如下:

--case when方案
Declare @sql varchar(8000)
Set @sql='Select Name'
Select @sql=@sql+' ,sum(Case When Product='''+Product+''' Then Quantity Else NULL End) as '+Product+'' 
From (Select DISTINCT Product From Sales) As t    --变量遍历赋值
Set @sql=@sql+' From Sales Group By Name'
exec(@sql)

--pivot方案 sql 2005及以上版本
Declare @sql varchar(8000)
Set @sql=(Select DISTINCT ','+Product From Sales FOR XML PATH(''))
Set @sql=STUFF(@sql,1,1,'')
Set @sql='Select * From Sales
PIVOT
(
    SUM(Quantity) For Product in('+@sql+')
) as pvt'
exec(@sql)

现在随意新增商品都可以自动生成我们想要的结果了。

MSSQL—行转列的更多相关文章

  1. MSSQL—行转列

    行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...

  2. Mssql 行转列

    ) set @sql='' --初始化变量@sql --变量多值赋值 ,,'')--去掉首个',' set @sql=' select * from( select objectid,name,jyj ...

  3. mssql 动态行转列。

    )) ,'张三' ,'李四' ,'王五' select * from #a a b ----------- ---- 张三 李四 王五 ( 行受影响) --行转列,步骤:''+张三+],[+王五+], ...

  4. mssql 数据库表行转列,列转行 比较经典

    --行列互转 /******************************************************************************************** ...

  5. 转:MSSQL SERVER行转列 列转行

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  6. [MSSQL]採用pivot函数实现动态行转列

    环境要求:2005+ 在日常需求中常常会有行转列的事情需求处理.假设不是动态的行,那么我们能够採取case when 罗列处理. 在sql 2005曾经处理动态行或列的时候,通常採用拼接字符串的方法处 ...

  7. sql的行转列(PIVOT)与列转行(UNPIVOT) webapi 跨域问题 Dapper 链式查询 扩展 T4 代码生成 Demo (抽奖程序)

    sql的行转列(PIVOT)与列转行(UNPIVOT)   在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比 ...

  8. SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...

  9. T-SQL 实现行转列

    问题: 我正在寻找一种有效的方式将行转换为SQL服务器中的列 例如,通过下表如何构建出预期结果表. Id  Value   ColumnName 1   John    FirstName 2   2 ...

随机推荐

  1. 电信级的RSA加密后的密码的破解方法

    一直以来,电信通过HTTP劫持推送广告的方式已经存在了很多年了,这种手段至今并未停止.这种手段月光博客曾经有多次曝光,见<电信级的网络弹出广告>.<获取了电信恶意弹出广告的罪证> ...

  2. img图片下面出现莫名的下边距解决办法

    图片底部的空隙实际上涉及行内元素的布局模型,图片默认的垂直对齐方式是基线,而基线的位置是与字体相关的.所以在某些时候,图片底部的空隙可能是 2px,而有时可能是 4px 或更多.不同的 font-si ...

  3. maven添加自己的jar包到本地仓库

     mvn install:install-file -DgroupId=com.esotericsoftware -DartifactId=minlog -Dversion=1.2 -Dpackagi ...

  4. learn python, ref, diveintopython 分类: python 2015-07-22 14:42 14人阅读 评论(0) 收藏

    for notes of learing python. // just ignore the ugly/wrong highlight for python code. ""&q ...

  5. python 中的高级函数map()

    map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于list [1, 2 ...

  6. AngularJs的UI组件ui-Bootstrap分享(十一)——Typeahead

    Typeahead指令是一个用于智能提示或自动完成的控件,就像Jquery的AutoComplete控件一样.来看一个最简单的例子: <!DOCTYPE html> <html ng ...

  7. jquery 显示弹出层可利用动画效果

    1 show()方法和hide()方法 $("selector").show()  从display:none还原元素默认或已设置的display属性$("selecto ...

  8. ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决

    先看oracle的监听和oracle的服务是否都启动了. 启动oracle监听:cmd命令行窗口下,输入lsnrctl start,回车即启动监听. 查看oracle的sid叫什么,比如创建数据库的时 ...

  9. 数据库DDL语句书写规范

    数据库DDL语句书写规范 1.SQL语句编写说明编写SQL语句应遵循统一的规范,包括大小写.空格.换行.缩进等等,只有完全一样的SQL才能在数据库中共享,从而减少硬解析. 字段类型.长度:根据数据情况 ...

  10. Dapper学习笔记(1)-开始

    Dapper是一款开源的轻量级ORM工具,源代码下载地址为https://github.com/StackExchange/dapper-dot-net,其具有以下特点: 1.Dapper是一个轻型的 ...