SQL:添加不同年份缺失的月份

标签 sql sql-server

SQL 服务器
[创建时间] - 日期时间
我得到这张表:

Year  Month  Count
2009    7     1 
2009    9     1 
2010    1     2 
2010    3     13

来自查询:

SELECT
   YEAR ([CreatedOn]) AS 'Year',
   MONTH ([CreatedOn]) AS 'Month',
   COUNT ([CreatedOn]) AS 'Count'
FROM xxx
GROUP BY YEAR ([CreatedOn]), MONTH ([CreatedOn])

我怎样才能得到这样的表格(有错过的月份和计数 0):

Year  Month  Count
2009    7     1
2009    8     0 
2009    9     1 
2009    10    0
2009    11    0
2009    12    0
2010    1     2 
2010    2     0
2010    3     13        

最佳答案

语法表明您正在使用MSSQL。使用Recursive CTE生成calender表,然后与XXX表进行左外连接

DECLARE @maxdate DATE = (SELECT Max([CreatedOn])
   FROM   xxx);

WITH calender
     AS (SELECT Min([CreatedOn]) dates,
         FROM   xxx
         UNION ALL
         SELECT Dateadd(mm, 1, dates)
         FROM   cte
         WHERE  dates < @maxdate)
SELECT Year(dates)         [YEAR],
       Month(dates)        [month],
       Count ([CreatedOn]) AS 'Count'
FROM   calender a
       LEFT OUTER JOIN xxx b
                    ON Year(dates) = Year ([CreatedOn])
                       AND Month(dates) = Month ([CreatedOn])
GROUP  BY Year(dates),
          Month(dates) 

注意:创建物理日历表,而不是递归 CTE

关于SQL:添加不同年份缺失的月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28299719/

相关文章:

sql-server - MS SQL 2012 插入触发器 : Insert all rows from a table

sql-server - SSDT 与 SSDT-BI

sql - SQL Server 中数字的通配符

sql-server - 本地 PC 和服务器环境之间的类型转换变化

.net - 在 .net 3.5 框架和 IIS 7.0 中使用 sqlserver session 状态时是否需要序列化属性

sql - Oracle - 文字与格式字符串错误不匹配

mysql - 返回带有特定标签的行

SQL 与 NOSQL : Which to use for this schema?

mysql - 将数据库标准化为 3NF

sql - 连接两个表并获取同一列中的输出数据