Получите кварталы года в SQL Server - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть этот запрос

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

Результирующий набор должен содержать все кварталы этого конкретного года независимо от даты и значение NULL, которое будет отображаться, если в этом квартале нет бизнеса.

Мне нужен такой набор результатов:

     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

Я пытался использовать функцию даты, но не смог получить требуемые результаты.

Искал функцию, похожую на EOMONTH, но не смог получить требуемых результатов.

Пожалуйста, помогите с этим.

1 Ответ

0 голосов
/ 05 сентября 2018

Я бы попытался сделать это, используя CTE.

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; 
...