SQL每月摘要

Cad*_*dab 2 sql sql-server sql-server-2008

我有一个表,其中包含每个项目的开始日期

例如:

ID - Startdate
1  - 2011-01-01
2  - 2011-02-01
3  - 2011-04-01
...
Run Code Online (Sandbox Code Playgroud)

我需要一个查询,它会给我每个月内每个项目的计数,我需要一个完整的12个月的报告.我试着简单地按照分组进行分组,Month(StartDate)但是对于没有值的月份,这并没有给我一个零,在上面的情况下,为3月.

所以我希望输出是沿着......

Month - Count
  1      20
  2      14
  3      0
...
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

谢谢.

Baa*_*aju 5

SELECT A.Month, ISNULL(B.countvalue,0) Count
FROM (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 ) A LEFT JOIN (SELECT datepart(month,Startdate) AS Month, Count(ID) as countvalue FROM yourTable GROUP BY datepart(month,Startdate))B
ON A.month = B.month
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


Lie*_*ers 5

使用SQL Server 2005+或执行此操作的另一种方法Oracle.

SQL语句

;WITH q (Month) AS (
    SELECT  1
    UNION ALL
    SELECT  Month + 1
    FROM    q   
    WHERE   q.Month < 12
)
SELECT  q.Month
        , COUNT(i.ID)
FROM    q
        LEFT OUTER JOIN Input i ON MONTH(i.StartDate) = q.Month
GROUP BY
        q.Month
Run Code Online (Sandbox Code Playgroud)

测试脚本

;WITH Input (ID, StartDate) AS (
    SELECT 1, '2011-01-01'
    UNION ALL SELECT 2, '2011-02-01'
    UNION ALL SELECT 3, '2011-04-01'
)
, q (Month) AS (
    SELECT  1
    UNION ALL
    SELECT  Month + 1
    FROM    q   
    WHERE   q.Month < 12
)
SELECT  q.Month
        , COUNT(i.ID)
FROM    q
        LEFT OUTER JOIN Input i ON MONTH(i.StartDate) = q.Month
GROUP BY
        q.Month
Run Code Online (Sandbox Code Playgroud)