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

在线等待 !sql 列传行问题
比如一个表有两个字段 类别 金额 

类别 金额
西药费 100
草药费 200
材料费 300

想出现以下效果
 
西药费 草药费 材料费
100 200 300


 而且费类类别 数量是不确定的 
哪位指点下 感激不尽

------解决方案--------------------
SQL code
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([类别] varchar(6),[金额] int)
insert [tb]
select '西药费',100 union all
select '草药费',200 union all
select '材料费',300
go

declare @sql varchar(8000)
select
  @sql=isnull(@sql+',','')
  +'sum(case when 类别='''+类别+''' then 金额 else 0 end) as ['+类别+']'
from
(select distinct 类别 from tb) t
exec ('select '+@sql+' from tb')

/**
材料费         草药费         西药费
----------- ----------- -----------
300         200         100

(1 行受影响)
**/

------解决方案--------------------
SQL code

declare @sql nvarchar(200)
declare @list nvarchar(100)
set @list=(select stuff((select ','+[类别] from tb for xml path('')),1,1,''))
set @sql = N'
select ' + @list + N'
from tb pivot(sum([金额]) for [类别] in ('+ @list + N')) b'

print @sql

exec(@sql)