只有一个表table1,字段为:
col1 varchar(10),
col2 date,
col3 int
数据库存的数据为:
日期 名称 总数
2009-04-02 C 1
2009-04-05 B 10
2009-03-31 D 11
2009-04-07 D 5
2009-03-31 A 1000
我想要得到的效果是:假如我要进行2009-03-31到2009-04-07日的多日查询,对应名称中(A、B、C、D、E、F),如果有数据就列出,如果没有就默认0:
日期 / 名称 A B C D E F
2009-03-31 1000 0 0 11 0 0
2009-04-01 0 0 0 0 0 0
2009-04-02 1 0 0 0 0 0
2009-04-03 0 0 0 0 0 0
2009-04-04 0 0 0 0 0 0
2009-04-06 0 0 0 0 0 0
2009-04-07 0 0 0 5 0 0
意思就是说,无论我选择查询的这几天是否有数据,都要显示出日期和名称.就算是空数据也要显示为上面的格式,
那位高手能帮我写这样的SQL语句?万分感激!!
----------------------------------------------------------------------------------------------------------------------
create table ta( 日期 datetime, 名称 varchar(10), 总数 int)
go
insert ta select '2009-04-02' , 'C' , 1
insert ta select '2009-04-05' , 'B' , 10
insert ta select '2009-03-31' , 'D' , 11
insert ta select '2009-04-07' , 'D' , 5
insert ta select '2009-03-31' , 'A' , 1000
insert ta select '2009-04-01' , 'E' , 1
insert ta select '2009-04-02' , 'F' , 1
go
set nocount on
declare @begin datetime,@end datetime, @sql varchar(8000)
set @begin='2009-03-31'
set @end='2009-04-07'
set @sql='select [日期 / 名称 ]=convert(varchar(10),日期,120)'
select * into #temp from
(select 日期,名称,总数 from ta where convert(varchar(10),日期,120) between convert(varchar(10),@begin,120) and convert(varchar(10),@end,120)
union all
select dateadd(dd,b.number,@begin),a.名称,0 from (select distinct 名称 from ta) a,master..spt_values b where b.type='p' and b.number between 0 and datediff(dd,@begin,@end)) c
select @sql=@sql+',['+名称+']=sum(case 名称 when '''+名称+''' then 总数 else 0 end) ' from (select distinct 名称 from ta) a
set @sql=@sql+ 'from #temp group by 日期 order by 日期'
exec (@sql)
drop table ta,#temp
/*
日期 / 名称 A B C D E F
---------- ----------- ----------- ----------- ----------- ----------- -----------
2009-03-31 1000 0 0 11 0 0
2009-04-01 0 0 0 0 1 0
2009-04-02 0 0 1 0 0 1
2009-04-03 0 0 0 0 0 0
2009-04-04 0 0 0 0 0 0
2009-04-05 0 10 0 0 0 0
2009-04-06 0 0 0 0 0 0
2009-04-07 0 0 0 5 0 0
*/