【问题标题】:SQL add month to a query without calendar tableSQL将月份添加到没有日历表的查询
【发布时间】:2012-10-31 21:18:02
【问题描述】:

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


表 1
身份证
日期1
日期2
日期3


我想按月份和ID汇总数据,所以查询结果是这样的:


table1的查询结果
身份证

不为空的月份中 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'。提前致谢!

【问题讨论】:

  • 您是否也关心年份,或者您希望将01/01/200801/01/2012 聚合在一起,例如?

标签: sql


【解决方案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

【讨论】:

  • 非常感谢!这很好用!年份还可以,我想我会使用 WHERE 并为所有三个日期指定年份。但如果我想要它作为结果的一部分,我会做同样的工会组织,对吗?顺便说一句,与使用月表相比,这对性能有什么显着影响吗?
  • 您有性能问题吗?如果没有,我不会担心这么小的桌子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多