日期:2014-05-18  浏览次数:20369 次

求行列转换。。和行合并。。。

有这样一个存在的表tb1,如下
Style itemnm Season factory qty buy_dt country
cc3155 表带 spring aaa 100 3/1/2012 cn
cc3155 表带 spring aaa 399 4/1/2012 cn
cb2543 轴承 summer bbb 359 2/1/2012 cn
cb2543 轴承 summer bbb 138 3/1/2012 cn
cb2543 轴承 summer bbb 234 3/1/2012 jp
nn3351 表盘 summer ccc 123 1/1/2012 cn
nn3351 表盘 summer ccc 989 3/1/2012 jp

在存储过程中执行下列语句,行列转换,同时同一个产品相同月份的数量相加(不区分国家country),
SQL code
set @sql='select style,ItemNM,Season,Factory'
select @sql=@sql+',sum(case buy_dt when '''+buy_dt+''' then qty else 0 end)  ['+buy_dt+']' from (select distinct convert(varchar(10),buy_dt,120) buy_dt from tb1) as a 

set @sql=@sql+'from (select style,ItemNM,Season,Factory,qty,convert(varchar(10),buy_dt,120) buy_dt from tb1) t group by style,ItemNM,Season,Factory,buy_dt'

exec(@sql)


得到如下表


Style itemnm Season factory 1/1/2012 2/1/2012 3/1/2012 4/1/2012
cc3155 表带 spring aaa 0 0 100 0
cc3155 表带 spring aaa 0 0 0 399
cb2543 轴承 summer bbb 0 359 0 0
cb2543 轴承 summer bbb 0 0 372 0
nn3351 表盘 summer ccc 123 0 0 0
nn3352 表盘 summer ccc 0 0 989 0


求:如何才能根据上表得到如下格式的数据表:

Style itemnm Season factory 1/1/2012 2/1/2012 3/1/2012 4/1/2012
cc3155 表带 spring aaa 0 0 100 399
cb2543 轴承 summer bbb 0 359 372 0
nn3351 表盘 summer ccc 123 0 989 0


------解决方案--------------------
--行列互转
--1、行换列
if object_id('Class') is not null
drop table Class
Go
Create table Class(
[Student] nvarchar(2),
[Course] nvarchar(2),
[Score] int)
Insert Class
select N'张三',N'语文',78 union all
select N'张三',N'数学',87 union all
select N'张三',N'英语',82 union all
select N'张三',N'物理',90 union all
select N'李四',N'语文',65 union all
select N'李四',N'数学',77 union all
select N'李四',N'英语',65 union all
select N'李四',N'物理',85 
Go

--2000方法:
--动态:
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='
 
+quotename([Course],'''')+' then [Score] else 0 end)'
from 
Class group by[Course]
--select @s
exec('select [Student]'+@s+' from Class group by [Student]')
--生成静态:
select 
[Student],
[数学]=max(case when [Course]='数学' then [Score] else 0 end),
[物理]=max(case when [Course]='物理' then [Score] else 0 end),
[英语]=max(case when [Course]='英语' then [Score] else 0 end),
[语文]=max(case when [Course]='语文' then [Score] else 0 end) 
from 
Class 
group by [Student]
GO
--动态:

declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]
select @s
exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')

--生成静态:
select * 
from 
Class 
pivot 
(max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b

--生成格式:
/*
Student 数学 物理 英语 语文
------- ----------- ----------- ----------- -----------
李四 77 85 65 65
张三 87 90 82 78

(2 行受影响)
*/

go
--加上总成绩(学科平均分)

--2000方法:
--动态:

declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+'then [Score] else 0 end)'
from Class group by[Course]
exec('select [Student]'+@s+',[总成绩]=sum([Score]) from Class group by [Student]')--加多一列(学科平均分用avg([Score]))

生成动态:

select 
[Student],
[数学]=max(case when