SQL查询返回按周、月和年分组的记录。没有记录的周应返回0

SQL查询返回按周、月和年分组的记录。没有记录的周应返回0,sql,sql-server,sql-server-2012,group-by,Sql,Sql Server,Sql Server 2012,Group By,鉴于以下数据: ID CreatedDate ID1 2014-06-04 01:40:56.880 ID8 2014-06-05 00:27:02.403 ID6 2014-06-04 01:51:47.060 ID7 2014-06-05 00:25:35.187 ID4 2014-06-04 01:48:44.157 ID10 2014-06-05 00:28:33.993 ID43 2014-06-16 05:17:18.80

鉴于以下数据:

ID      CreatedDate
ID1     2014-06-04 01:40:56.880
ID8     2014-06-05 00:27:02.403
ID6     2014-06-04 01:51:47.060
ID7     2014-06-05 00:25:35.187
ID4     2014-06-04 01:48:44.157
ID10    2014-06-05 00:28:33.993
ID43    2014-06-16 05:17:18.803
ID72    2014-06-20 04:00:07.733
.
.
.
Etc.
我需要编写一个查询,将记录按周、月和年分组。需要返回在特定周内创建的记录数的计数。输出应如下所示:

Week    Month   Year    Count
23         6    2014    16
24         6    2014    0
25         6    2014    7
26         6    2014    0
27         7    2014    25
28         7    2014    18  
.
.
.
etc.

如果一周没有记录,则计数应返回0。仅应返回在执行查询后的过去12个月内创建的记录。每周都将执行查询以生成报告。

演示目的我使用表名为[DBO].[FACTINTERNETSALES]和列[ORDERDATE] 对于您来说,列将是[CreatedDate]。 仅供参考,这是在SQL Server中完成的

DECLARE @START INT,
        @END INT

SELECT @START   = CAST(CAST(MIN(ORDERDATE) AS DATETIME) AS INT) FROM [DBO].[FACTINTERNETSALES] 
SELECT @END     = CAST(CAST(MAX(ORDERDATE) AS DATETIME) AS INT) FROM [DBO].[FACTINTERNETSALES] 

--SELECT @START,@END

DECLARE @DATEDIM TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, DATED DATETIME)
WHILE @START <= @END
BEGIN
    INSERT INTO @DATEDIM VALUES (CAST(@START AS DATETIME))
    SET @START = @START  + 1 
END

SELECT      LU.WEEK,LU.MONTH,LU.YEAR,ISNULL(MAIN.COUNT,0) [COUNT]
FROM        (
            SELECT      DATEPART(WEEK,DATED) [WEEK],DATEPART(MONTH,DATED) [MONTH],DATEPART(YEAR,DATED) [YEAR] 
            FROM        @DATEDIM
            GROUP BY    DATEPART(WEEK,DATED),DATEPART(MONTH,DATED),DATEPART(YEAR,DATED)) LU
LEFT JOIN
            (
            SELECT  [YEAR],[MONTH],[WEEK],COUNT(*) [COUNT] FROM
            (SELECT DATEPART(YEAR,ORDERDATE) [YEAR],
                    DATEPART(MONTH,ORDERDATE) [MONTH],
                    DATEPART(WEEK,ORDERDATE) [WEEK]
            FROM    [DBO].[FACTINTERNETSALES] ) LUINNER
            GROUP BY [YEAR],[MONTH],[WEEK]) MAIN 
ON
            LU.MONTH = MAIN.MONTH AND
            LU.YEAR = MAIN.YEAR AND
            LU.WEEK = MAIN.WEEK
ORDER BY    LU.YEAR,LU.MONTH,LU.WEEK
DECLARE@START INT,
@结束整型
从[DBO].[FACTINTERNETSALES]中选择@START=CAST(CAST(MIN(ORDERDATE)作为DATETIME)作为INT)
从[DBO].[FACTINTERNETSALES]中选择@END=CAST(CAST(MAX(ORDERDATE)作为DATETIME)作为INT)
--选择@START、@END
DECLARE@DATEDIM表(ID INT-IDENTITY(1,1)主键,日期为DATETIME)

WHILE@START您使用的是哪种DBMS?博士后?Oracle?使用您的架构和示例数据创建一个url,这将非常有用。我正在使用Microsoft SQL Server 2012如果您有一个包含365条记录(包含数字1到365)的(临时)表,它应该是可行的。就在我键入时,Jithin Shaji已经发布了一个实现:)谢谢Jithin,这正是我要找的。是否可以合并重复周数。例如,使用您上面提供的结果,我们是否可以将两个第13周的条目合并为39个计数,而不是将条目同时用于第3个月和第4个月,将条目仅用于第4个月?