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
粮食 大米 1200
水果 桔子 10300
粮食 麦子 0025
水果 苹果 2000