在SQL Server中使用一年四个季度

在SQL Server中使用一年四个季度,sql,sql-server-2012,Sql,Sql Server 2012,我有这个疑问 CREATE TABLE #TEMP ( PRODUCTCLASS NVARCHAR(50), YEAR INT, QUARTER INT, CUSTOMERCOUNT BIGINT ) INSERT INTO #TEMP (PRODUCTCLASS, YEAR, QUARTER, CUSTOMERCOUNT) SELECT PROD.PRODUCTCLASS, DATEPART(YEAR, P.ACTUA

我有这个疑问

CREATE TABLE #TEMP
(
    PRODUCTCLASS NVARCHAR(50),
    YEAR INT,
    QUARTER INT,
    CUSTOMERCOUNT BIGINT
)

INSERT INTO #TEMP (PRODUCTCLASS, YEAR, QUARTER, CUSTOMERCOUNT)
    SELECT 
        PROD.PRODUCTCLASS,
        DATEPART(YEAR, P.ACTUALDT),
        DATEPART(QUARTER, P.ACTUALDT),
        ISNULL(COUNT(P.CUSTOMERCODE), 0)
    FROM 
        POSTINGS AS P,  PRODUCTPOSTINGS R 
    WHERE 
        PRODID = P.PRODID 
    GROUP BY  
        PRODUCTCLASS, DATEPART(YEAR, P.ACTUALDT), DATEPART(QUARTER, P.ACTUALDT) 

SELECT * FROM #TEMP 
上述查询仅在所选日期的相应季度中生成。查询将返回以下结果:

     PRODUCTCLASS    YEAR   QUARTER  CUSTOMERCOUNT
     ---------------------------------------------
        CRAFT        2018     3         20
        DANCE        2017     2         18
        CRAFT        2018     1         12
        DANCE        2018     4         10
结果集应包含该特定年份的所有季度,无论日期如何,如果该季度没有业务,则显示空值

我需要这样的结果集:

     PRODUCTCLASS        YEAR   QUARTER   CUSTOMERCOUNT
     ---------------------------------------------------
            CRAFT        2018     1         12
            CRAFT        2018     2         null
            CRAFT        2018     3         20
            CRAFT        2018     4         null
            DANCE        2017     1         NULL
            DANCE        2017     2         18
            DANCE        2017     3         NULL
            DANCE        2017     4         NULL
            DANCE        2018     1         NULL
            DANCE        2018     2         NULL
            DANCE        2018     3         NULL
            DANCE        2018     4         10
我已尝试使用date函数,但无法获得所需的结果

查找类似于EOMONTH的函数,但无法获得所需的结果


请帮忙

我会尝试使用CTEs来实现这一点

WITH 
Qrtr(Q) AS (
  SELECT 1 
  UNION ALL
  SELECT Q + 1 FROM Qrtr
  WHERE Q < 4
),
Yr(Y) AS (
  SELECT 2018 
  UNION ALL
  SELECT Y - 1 FROM Yr
  WHERE Y > 2018 - 5
),
Cls(C) AS (
  SELECT 'CRAFT' 
  UNION 
  SELECT 'DANCE' 
)
SELECT CTE.C , CTE.Y , CTE.Q , DB.[Num] 
FROM ( 
SELECT C , Y , Q FROM Cls AS C, Yr AS Y, Qrtr AS Q ) AS CTE 
LEFT OUTER JOIN 
( SELECT R.PRODUCTCLASS , R.YEAR , R.QUARTER , COUNT(ISNULL(P.CUSTOMERCODE,0) AS [Num] FROM PRODUCTPOSTINGS AS R
  INNER JOIN POSTINGS AS P ON P.PRODID = R.PRODID ) AS DB 
ON DB.YEAR = CTE.Y AND DB.QUARTER = CTE.Q AND DB.PRODUCTCLASS = CTE.C
GROUP BY CTE.C, CTE.Y, CTE.Q 
ORDER BY C, Y DESC, Q ASC; 

你能试试分组吗?如下所示:按多维数据集PRODUCTCLASS分组,DATEPARTYEAR,P.ACTUALDT,DATEPARTQUARTER,P.actualdty您需要一个日历表。如果你搜索它,你会发现很多例子。