Как группировать по неделям, даже когда счетчик равен 0 - PullRequest
0 голосов
/ 26 апреля 2019

Мой пример ниже работает нормально, единственная проблема, с которой я сталкиваюсь, это то, что недели с 0 результатами не отображаются. Вот пример моего кода:

SELECT 
DATENAME (WK, DATE) AS WEEK,
COUNT (DISTINCT COMPANY_ID) AS AMOUNT
FROM
(
SELECT COMPANY, DATE = MIN(DATE)
FROM TABLE1 A INNER JOIN TABLE2 B
ON A.ID = B.ID
WHERE YEAR(A.DATE) = '2019' AND COMPANY_ID NOT IN(SELECT COMPANY_ID  FROM 
TABLE1 A INNER JOIN TABLE2 B  ON A.ID = B.ID AND DATE < '2019-01-01') GROUP 
BY COMPANY_ID) d    

GROUP BY dateadd(wk, datediff(wk, 0, DATE), 0),  DATENAME(WK, DATE) 
ORDER BY dateadd(wk, datediff(wk, 0, DATE), 0)

Мой текущий вывод выглядит так:

week      | amount
4        |  354
6        |  222
7        |  144
8        |  354
9        |  45
10       |  55
11       |  76
12       |  98
13       |  45
14       |  344

Приведенный выше результат отсутствует много недель (1,2,3 и 15,16,17 и т. Д.) Как мне показать тех, у кого 0?

Мой желаемый вывод:

week     | amount
1        |  0
2        |  0
3        |  0
4        |  354
6        |  222
7        |  144
8        |  354
9        |  45
10       |  55
11       |  76
12       |  98
13       |  45
14       |  344
15       |  0
16       |  0
17       |  0

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Сначала создайте временную таблицу с номерами всех недель

, затем присоедините ее к вашему запросу

DECLARE @Weeks AS Table(ID int)

DECLARE @i int = 1


WHILE @i < 53
BEGIN
INSERT INTO @Weeks (ID)
VALUES(@i)
SET @i = @i  + 1
END

SELECT * FROM @Weeks


SELECT 
DATENAME (WK, DATE) AS WEEK,
COUNT (DISTINCT COMPANY_ID) AS AMOUNT
FROM
(
SELECT COMPANY, DATE = MIN(DATE)
FROM TABLE1 A INNER JOIN TABLE2 B
ON A.ID = B.ID
RIGHT OUTER JOIN @Weeks W ON W.ID = DATENAME (WK, DATE) 
WHERE YEAR(A.DATE) = '2019' AND COMPANY_ID NOT IN(SELECT COMPANY_ID  FROM 
TABLE1 A INNER JOIN TABLE2 B  ON A.ID = B.ID AND DATE < '2019-01-01') GROUP 
BY COMPANY_ID) d    

GROUP BY dateadd(wk, datediff(wk, 0, DATE), 0),  DATENAME(WK, DATE) 
ORDER BY dateadd(wk, datediff(wk, 0, DATE), 0)
0 голосов
/ 26 апреля 2019

Несколько замечаний -

1) Ваш текущий запрос неверен (возможно, вы удалили некоторую его часть, чтобы скрыть конфиденциальные данные).Ex.В подзапросе с именем "d" GROUP BY находится в столбце "company_id", но "company" была SELECT -ed.

SELECT  DATENAME (WK, DATE) AS WEEK,
    COUNT (DISTINCT COMPANY_ID) AS AMOUNT
FROM    
(
    SELECT COMPANY /*Different from group_by clause*/, DATE = MIN(DATE)
    FROM TABLE1 A INNER JOIN TABLE2 B ON (A.ID = B.ID)
    WHERE   YEAR(A.DATE) = '2019' 
        AND COMPANY_ID NOT IN 
        (   
            SELECT COMPANY_ID
            FROM TABLE1 A INNER JOIN TABLE2 B ON A.ID = B.ID AND DATE < '2019-01-01'
        ) 
    GROUP BY COMPANY_ID
) d    
GROUP BY dateadd(wk, datediff(wk, 0, DATE), 0),  DATENAME(WK, DATE) 
ORDER BY dateadd(wk, datediff(wk, 0, DATE), 0)

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

3) Не могли бы вы опубликовать некоторые входные данные, чтобы лучше понять вывод.

(Извиняюсь за публикацию здесь, поскольку я не имею права комментировать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...