现阶段sql语句如下select 日期=convert(varchar(10),StatisticsDate,120),sum(字段A) AS 本地有效对话量,sum(字段B) AS 外地有效对话量
from DialogueQuantity
where StatisticsDate>='2012-03-01' and StatisticsDate<'2012-03-31' and ProjectID =16 group by convert(varchar(10),StatisticsDate,120)
现在有了新要求,现有三个标识列,分别为AllDayStatusDQ、AfternoonStatusDQ 、MorningStatusDQ 这三个列都是bit类型,默认值为false。
要求如下:
1.当 AllDayStatusDQ='True' 时,汇总【字段A】和【字段B】(也就是汇总上面sql语句中那两个字段)
2.当 AllDayStatusDQ is null and AfternoonStatusDQ = 'True'时,汇总【字段C】和【字段D】
3.当AllDayStatusDQ is null and AfternoonStatusDQ is null and MorningStatusDQ='True'时,汇总【字段E】和【字段F】注:【字段A】~【字段B】汇总过程中,如果碰到NULL 转化成0即可
请问应该如何更改这条sql语句以达到我的目的?
from DialogueQuantity
where StatisticsDate>='2012-03-01' and StatisticsDate<'2012-03-31' and ProjectID =16 group by convert(varchar(10),StatisticsDate,120)
现在有了新要求,现有三个标识列,分别为AllDayStatusDQ、AfternoonStatusDQ 、MorningStatusDQ 这三个列都是bit类型,默认值为false。
要求如下:
1.当 AllDayStatusDQ='True' 时,汇总【字段A】和【字段B】(也就是汇总上面sql语句中那两个字段)
2.当 AllDayStatusDQ is null and AfternoonStatusDQ = 'True'时,汇总【字段C】和【字段D】
3.当AllDayStatusDQ is null and AfternoonStatusDQ is null and MorningStatusDQ='True'时,汇总【字段E】和【字段F】注:【字段A】~【字段B】汇总过程中,如果碰到NULL 转化成0即可
请问应该如何更改这条sql语句以达到我的目的?
日期 全天标识 下午标示 上午标识 全天值一 全天值二 下午值一 下午值二 上午值一 上午值二
2012-02-24 true NULL ture 1 2 3 4 5 6
2012-02-25 NULL NULL true 7 8 9 10 11 12
2012-02-26 fasle NULL true 13 14 15 16 17 18
2012-02-26 NULL true true 19 20 21 22 23 24
2012-02-27 true true true 25 26 27 28 29 30
2012-02-25 NULL true true 31 32 33 34 35 36
2012-02-24 NULL true NULL 37 38 39 40 41 42想要的结果日期 值一汇总 值二汇总
2012-02-24 40 42
2012-02-25 44 46 --第一行结果的原因: 值一汇总=第一行的【全天值一】+最后一行的【下午值一】=1+39=40 值二汇总=2+40=42
--第二行结果原因: 11+33=44 12+34=46注:说白了,那三个标识列的组合我们只考虑三种 就是如下
1.全天标识='True' : 这种情况下只要去 汇总 【全天值一】 和 【全天值二 】 就可以了 至于其它两个标识是什么可以无视
2.全天标识为NULL 并且 下午标识为 'True'时: 这种情况下只去汇总 【下午值一】 和 【下午值二】 就可以了, 上午标识列是什么可以无视
3.全天标识为NULL 并且 下午标识为NULL 并且 上午标识为 'True'时: 这种情况 汇总【上午值一】和【上午值二】就可以了
2012-02-24 true NULL ture 1 2 3 4 5 6
2012-02-25 NULL NULL true 7 8 9 10 11 12
2012-02-26 fasle NULL true 13 14 15 16 17 18
2012-02-26 NULL true true 19 20 21 22 23 24
2012-02-27 true true true 25 26 27 28 29 30
2012-02-25 NULL true true 31 32 33 34 35 36
2012-02-24 NULL true NULL 37 38 39 40 41 42
--> 测试数据:[test]
if object_id('[test]') is not null
drop table [test]
create table [test](
[日期] date,
[全天标识] varchar(5),
[下午标示] varchar(4),
[上午标识] varchar(4),
[全天值一] int,
[全天值二] int,
[下午值一] int,
[下午值二] int,
[上午值一] int,
[上午值二] int
)
insert [test]
select '2012-02-24','true',null,'ture',1,2,3,4,5,6 union all
select '2012-02-25',null,null,'true',7,8,9,10,11,12 union all
select '2012-02-26','fasle',null,'true',13,14,15,16,17,18 union all
select '2012-02-26',null,'true','true',19,20,21,22,23,24 union all
select '2012-02-27','true','true','true',25,26,27,28,29,30 union all
select '2012-02-25',null,'true','true',31,32,33,34,35,36 union all
select '2012-02-24',null,'true',null,37,38,39,40,41,42select
[日期],
SUM(case
when [全天标识]='true' then [全天值一]
when [全天标识] is null and [上午标识] ='true' then [上午值一]
when [全天标识] is null and [下午标示] ='true' then [下午值一]
else 0 end) as 值一汇总,
SUM(case
when [全天标识]='true' then [全天值二]
when [全天标识] is null and [上午标识] ='true' then [上午值二]
when [全天标识] is null and [下午标示] ='true' then [下午值二]
else 0 end) as 值二汇总
from
[test]
group by
[日期]
/*
日期 值一汇总 值二汇总
2012-02-24 40 42
2012-02-25 46 48
2012-02-26 23 24
2012-02-27 25 26
*/有啥问题自己改改,思路就这样,有点忙了