按日期时间字段分组

时间:2013-12-18 00:40:08

标签: sql oracle datetime

我有一个包含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

我想知道是否有一种方法可以将三个查询组合在一起,而不是一次只编写一次查询?

1 个答案:

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

有多种方法可以做到。