我有一个包含ID字段和3个日期时间字段的表。我需要按月份获取每个日期时间字段的计数。我正在使用
Select to_char(datatime1,'Mon-yyyy'),count(id) from table
where datetime1 is not null
Select to_char(datatime2,'Mon-yyyy'),count(id) from table
where datetime2 is not null
Select to_char(datatime3,'Mon-yyyy'),count(id) from table
where datetime3 is not null
然后我将此结果复制到excel并设置如下数据:
Month CountID(datetime1) CountID(datetime2) CountID(datetime3)
June-2013 50 20 16
July-2013 24 10 56
我想知道是否有一种方法可以将三个查询组合在一起,而不是一次只编写一次查询?
答案 0 :(得分:1)
尝试
select p , sum(cnt1) as cnt1 , sum(cnt2) as cnt1 , sum( cnt3 ) as cnt3
from ( select to_char(datetime1,'Mon-yyyy') as p ,
count(id) as cnt1 ,
0 as cnt2 ,
0 as cnt3
from table
where datetime1 is not null
group by to_char(datetime1,'Mon-yyyy')
UNION ALL
select to_char(datetime2,'Mon-yyyy') as p ,
0 as cnt1 ,
count(id) as cnt2 ,
0 as cnt3
from table
where datetime2 is not null
group by to_char(datetime2,'Mon-yyyy')
UNION ALL
select to_char(datetime3,'Mon-yyyy') as p ,
0 as cnt1 ,
0 as cnt2 ,
count(id) as cnt3
from table
where datetime2 is not null
group by to_char(datetime2,'Mon-yyyy')
) t
group by t.p
order by t.p
或者说可以简单的联盟+左联盟:
select to_char(t.dt,'Mon-yyyy') as period ,
sum(case when t1.id is not null then 1 else 0 end) as cnt1 ,
sum(case when t2.id is not null then 1 else 0 end) as cnt2 ,
sum(case when t3.id is not null then 1 else 0 end) as cnt3
from ( select datetime1 as dt from table where datetime1 is not null
UNION
select datetime2 as dt from table where datetime2 is not null
UNION
select datetime3 as dt from table where datetime3 is not null
) t
left join table t1 on t1.datetime1 = t.dt
left join table t2 on t2.datetime2 = t.dt
left join table t3 on t3.datetime3 = t.dt
group by to_char(t.dt,'Mon-yyyy')
有多种方法可以做到。