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

SQL语句 列不是固定的怎么做啊
数据如下
商品类别 商品名 数量 出货日
水果 苹果 20 10/1
水果 桔子 10 10/1
水果 桔子 30 10/2
粮食 大米 12 10/1
粮食 麦子 25 10/4

不能用自定义函数,想得到的结果如下:  

商品类别 商品名 10/1 10/2 10/4
水果 苹果 20 
水果 桔子 10 30
粮食 大米 12  
粮食 麦子 25

如何实现阿
 

------解决方案--------------------
create table #temp
(
splb varchar(10),
spm varchar(10),
sl int,
chr varchar(5) 
)
go

insert into #temp select
'水果','苹果', 20, '10/1' union all select 
'水果','桔子', 10, '10/1' union all select
'水果','桔子', 30, '10/2' union all select
'粮食','大米', 12, '10/1' union all select
'粮食','麦子', 25, '10/4' 
go

declare @sql varchar(4000)
set @sql='select splb,spm'
select @sql=@sql+' ,sum(case when chr='''+chr+''' then sl else 0 end) '''+chr+''''
from #temp
group by chr

select @sql=@sql+' from #temp group by splb,spm,chr order by 1 desc,3 desc'

exec (@sql)

drop table #temp

/*

(5 row(s) affected)

splb spm 10/1 10/2 10/4
---------- ---------- ----------- ----------- ----------- 
水果 苹果 20 0 0
水果 桔子 10 0 0
水果 桔子 0 30 0
粮食 大米 12 0 0
粮食 麦子 0 0 25
*/
------解决方案--------------------
--用动态SQL语句实现动态交叉表


create table T (商品类别 varchar(100),商品名 varchar(100), 数量 int, 出货日 varchar(100))


insert into T select '水果', '苹果', 20, '10/1' 
insert into T select '水果', '桔子', 10, '10/1' 
insert into T select '水果', '桔子', 30, '10/2' 
insert into T select '粮食', '大米', 12, '10/1' 
insert into T select '粮食', '麦子', 25, '10/4'



declare @sql varchar(4000) 
set @sql = 'select 商品类别,商品名 ' 

select @sql = @sql + ' , sum(case 出货日 when '''+出货日+ ''' then 数量 end) as [ '+出货日+ '] ' 
from (select distinct 出货日 from T) as a 

set @sql = @sql + ' from T group by 商品类别,商品名 order by 商品类别,商品名' 

print @sql

exec(@sql) 


drop table T

/*

--结果
商品类别 商品名 10/1 10/2 10/4
-------------------------------------------------------
粮食 大米 12 NULL NULL
粮食 麦子 NULL NULL 25
水果 桔子 10 30 NULL
水果 苹果 20 NULL NULL


*/
------解决方案--------------------
借用wangtiecheng数据:
create table T (商品类别 varchar(100),商品名 varchar(100), 数量 int, 出货日 varchar(100)) 


insert into T select '水果 ', '苹果 ', 20, '10/1 '
insert into T select '水果 ', '桔子 ', 10, '10/1 '
insert into T select '水果 ', '桔子 ', 30, '10/2 '
insert into T select '粮食 ', '大米 ', 12, '10/1 '
insert into T select '粮食 ', '麦子 ', 25, '10/4 ' 

go

declare @s nvarchar(4000)
set @s=''
select @s=@s+','+quotename(出货日)+'= sum(case when 出货日='+quotename(出货日,'''')+' then 数量 else 0 end)'
from T group by 出货日

exec('select 商品类别,商品名'+@s+' from T group by 商品类别,商品名 order by 商品类别')
go
粮食 大米 12 0 0
水果 桔子 10 30 0
粮食 麦子 0 0 25
水果 苹果 20 0 0