按时间段统计,不连续的日期要补上

只有一个表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

*/
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值