SQL行转列

SQL行转列是比较经典的问题:

比如有如下数据表,有如下某一款号(表1): 

  颜色  尺码  库存  

  红色    S    10 

  红色    M    80 

  白色    L    50 

  白色    S    60

要将上面的表转化为如下格式(表2): 

颜色    S  M  L 

红色  10  80  0  

白色  60  0  50

 

动态sql:

create  table #tbl_0

(

   color nvarchar(12),

   nsize nchar(1),

   store int

)

insert into #tbl_0

select 'red',    'S',    '10' union all 

select  'red',    'M',    '80'  union all

select 'white',    'L',    '50'  union all

select  'white',    'S',    '60'

select * from #tbl_0

--结果

--red    S    10

--red    M    80

--white    L    50

--white    S    60

 

declare @sql varchar(4000)

set @sql = ' select color,'

select @sql= @sql+'isnull(sum(case nsize when '''+ns+''' then isnull(store,0) end),0) '''+ns+''','

    from (select 'S' as ns union all select 'M' union all select 'L') a

set @sql = stuff(@sql,len(@sql),1,'')

set @sql=@sql+ ' from #tbl_0 group by color'

exec(@sql)

--结果

--red    10    80    0

--white    60    0    50

drop table #tbl_0

 

静态sql:

select color,

isnull(sum(case nsize when 'S' then isnull(store,0) end),0) 'S',

isnull(sum(case nsize when 'M' then isnull(store,0) end),0) 'M',

isnull(sum(case nsize when 'L' then isnull(store,0) end),0) 'L'

from #tbl_0 group by color

 

 

时间: 2024-10-26 15:55:59

SQL行转列的相关文章

SQL行转列和列转行代码详解

行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和总结过.为了加深认识,再总结一次. 行列互转,可以分为静态互转,即事先就知道要处理多少行(列);动态互转,事先不知道处理多少行(列). --创建测试环境 USE tempdb; GO IF OBJECT_ID('dbo.Orders') IS NOT NULL DROP TABLE dbo.Orde

sql 行转列 PIVOT 列转行 UNPIVOT

原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 22 2013 公司3 32 2012 公司1 42 2012 公司2 52 2012 公司3 62     表二: 年 公司1 公司2 公司3 2012 42 52 62 2013 12 22 32     可使用sql2005之后提供的PIVOT   具体操作如下:   select  *  f

sql 行转列总结

原文:sql 行转列总结 PIVOT UNPIVOT的用法 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2

SQL行转列汇总

原文:SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 注意:PIVOT.UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为   90 ) SQL2008 中可以直接使用 完整语法: table_source PIVOT( 聚合函数(value_colu

数据库行转列-SQL行转列的问题,求各位大大帮助下

问题描述 SQL行转列的问题,求各位大大帮助下 数据库中保存的是: 单据类型 审核级次 审核人 A 1级 张三 A 1级 李四 A 2级 王五 求查出的数据为: 单据类型 1级审核人 2级审核人 A 张三 王五 A 李四 该如何写代码啊,小白求助!!

sql行转列,(不写死)

问题描述 sql行转列,(不写死) 图一为数据结果: 想要图二的效果: 要求:不写死即不出现具体的查询出的数据的内容 解决方案 这个我没怎么搞过,不过你可以参照这个试一试.http://www.williamsang.com/archives/1508.html 解决方案二: 说实话不太明白你的意思. 行转列.你不规定列名.后台怎么知道把哪列转换成一行? 如果你想隐蔽的话.可以先用视图再用行转列 解决方案三: 不写死,只能用存储过程 或者 code 实现!单SQL应该是比较难!

重温SQL——行转列,列转行

行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清晰,而且比较习惯. 但是PIVOT .UNPIVOT提供的语法比一系列复杂的SELECT...CASE 语句中所指定的语法更简单.更具可读性.下面我们通过几个简单的例子来介绍一下列转行.行转列问题. 我们首先先通过一个老生常谈的例子,学生成绩表(下面简化了些)来形象了解下行转列  CREATE TA

[转载]SQL行转列,列转行

原文地址:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html  行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现. 用传统的方法,比较好理解.层次清晰,而且比较习惯. 但是PIVOT .UNPIVOT提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单.更具可读性.下面我们通过

sql 行转列

问题描述 sql论坛没人.才来C#论坛来发贴.这样一行数据,201502是我根据参数'2015'取最大2015xx(数据不止一行,一共是7行,前3年,后3年,包括本年最大)我要转换成列,如表格图一样,我想查询成2015列名123.0000对应列Month1To2_WorkBook_Audit_Invest456.0000对应列Month1To3_WorkBook_Audit_Invest.........一共1to2到1to1211个列.SELECTMonth1To2_WorkBook_Audi