2013-12-18 5 views
2

У меня есть таблица, содержащая поле ID и 3 поля datetime. Мне нужно получить количество каждого времени полей даты monthwise.I я используюГруппа По полям datetime

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 

Тогда я копирую это приводит на первенствует и настройки данных, как показано ниже:

Month  CountID(datetime1) CountID(datetime2) CountID(datetime3) 
June-2013 50     20     16 
July-2013 24     10     56 

мне было интересно, если есть способ я могу комбинировать три запроса, вместо того, чтобы писать один раз запрос за раз?

ответ

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') 

Там больше, чем один из способов сделать это.

+0

+1 Я делал скрипку, чтобы ответить, но так как вы сделали это сначала ... Вот скрипка: http://sqlfiddle.com/#!4/d0e9d/3 –

+1

Спасибо! Великие мысли думают одинаково: D –

Смежные вопросы