Reputation: 3789
I have a table which contains ID field and 3 datetime fields. I need get the count of each date time field monthwise.I am using
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
Then I am copying this results onto excel and setting up data as below :
Month CountID(datetime1) CountID(datetime2) CountID(datetime3)
June-2013 50 20 16
July-2013 24 10 56
I was wondering if there is a way I can combine the three queries , instead of writing once query at a time?
Upvotes: 2
Views: 120
Reputation: 74197
Try
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
Or the arguably simpler union + left join:
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')
There's more than one way to do it.
Upvotes: 1