SQL将月份添加到没有日历表的查询中

时间:2012-10-31 21:18:03

标签: sql

我在这里有一个非常简单的表:


表1
ID
日期1
DATE2
Date3


我想按月和ID汇总数据,以便查询结果如下:


查询table1的结果
ID

从非月份的月份开始的Date1计数 从非月份的月份开始的Date2计数 从非空的月份开始的Date3计数


我目前在下面有这个查询,根据@month指定的内容只拉一个月:

Select ID, @month as [Month]  
Sum((Case When Month(Date1)=@month then 1 else 0 END)) as [Date1 Count],   
Sum((Case When Month(Date2)=@month then 1 else 0 END)) as [Date2 Count],  
Sum((Case When Month(Date3)=@month then 1 else 0 END)) as [Date3 Count],  
From Table1  
Group by ID 

但是我想拉所有12个月,但数据库没有月份表或日历表,如何创建一个查询,其中包含每个ID的所有12个月并获取他们的Date1,Date2和Date3的相应月度计数?顺便说一句,很多条目都有一个空日,例如Date1和Date3 = Null,而Date2 = '01 / 01/2008'。提前谢谢!

1 个答案:

答案 0 :(得分:1)

由于只有12个月且永远不会改变,因此使用CTE或子查询生成月份数字非常简单:

;with M as (
  select 1 as month union
  select 2 union
  select 3 union
  select 4 union
  select 5 union
  select 6 union
  select 7 union
  select 8 union
  select 9 union
  select 10 union
  select 11 union
  select 12
)
Select ID, M.Month,
Sum((Case When Month(Date1)=M.Month then 1 else 0 END)) as [Date1 Count],   
Sum((Case When Month(Date2)=M.Month then 1 else 0 END)) as [Date2 Count],  
Sum((Case When Month(Date3)=M.Month then 1 else 0 END)) as [Date3 Count]  
From M,Table1
Group by ID,M.month

演示:http://www.sqlfiddle.com/#!3/19ed6b/1