Преобразуйте 0 в понедельник за неделю, когда данные не возвращаются, SQL - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь написать SQL-запрос, который вернет счетчик всех продуктов, запущенных за неделю. Дата на каждый понедельник. Таким образом, каждая строка будет возвращать понедельник этой недели и общее количество единиц, начатых на этой неделе. Общее количество недель должно быть за каждую неделю текущего квартала, к которому относится отчет. У меня есть этот код, однако, когда на этой неделе не создается никаких единиц, тогда данные отсутствуют. Мне нужно вернуть 0 на неделях, в которых не запущены юниты, вместо того, чтобы просто не быть там. Я нашел некоторые источники в Интернете, но они в основном использовали команду «generate_series», которой моя SSMS, похоже, не имеет.

Пример данных: таблица A

Product--------DateStarted-----
1              2019-10-2
1              2019-10-4
1              2019-10-3
1              2019-10-23
1              2019-11-08
1              2019-11-09

-

Желаемый результат:

 Week----------Product Count
 2019-09-30    3
 2019-10-07    0
 2019-10-14    0
 2019-10-21    1
 .....Continued 0s for each week with the date being monday
 2019-11-04    2
 ...continued to end of quarter
 2019-12-30     0

-

Текущий результат:

  Week------------ProductCount-----
  2019-09-30      3
  2019-10-21      1
  2019-11-04      2

-

Текущий код SQL

SELECT Count([week]) as 'TotalStarted', [week] FROM 
(SELECT 
DATEADD(DAY, 2 -DATEPART(WEEKDAY, Crated),  CAST(DateStarted as date)) as 'Week' 
FROM tableA 
WHERE Product like ('1') 
AND [DateStarted] >= DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0) AND 
[DateStarted] <= DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) +1, 0))) tbla 
Group by [Week]

1 Ответ

0 голосов
/ 04 октября 2019

Используйте, имея

SELECT Count([week]) as 'TotalStarted', [week] FROM 
(SELECT 
DATEADD(DAY, 2 -DATEPART(WEEKDAY, Crated),  CAST(DateStarted as date)) as 'Week' 
FROM tableA 
WHERE Product like ('1') 
AND [DateStarted] >= DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0) AND 
[DateStarted] <= DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) +1, 0))) tbla 
Group by [Week]
HAVING Count([week])>0

Извините, я действительно неправильно понял. Попробуйте что-то вроде этого. На самом деле это ответ avery_larry
Если вы считаете, что вам нужно адаптировать репрезентативный день недели


;WITH [0 to 12] (v) as 
(
SELECT V
FROM (
  VALUES (0), (1), (2), (3), (4), (5) ,(6), (7), (8), (9), (11), (12) 
)T(V)
),
[date_in_qq] (week) as (
    SELECT DATEADD(day,DATEDIFF(day,0,DATEADD(qq, DATEDIFF(qq, 0, GETDATE()),0)),v*7)
    FROM [0 to 12]
)
SELECT Count(tbla.[week]) as 'TotalStarted', [date_in_qq].[week] FROM 
[date_in_qq] 
LEFT OUTER JOIN 
(SELECT 
DATEADD(DAY, 2 -DATEPART(WEEKDAY, Crated),  CAST(DateStarted as date)) as 'Week' 
FROM tableA 
WHERE Product like ('1') 
AND [DateStarted] >= DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0) AND 
[DateStarted] <= DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) +1, 0))) 
tbla ON tbla.[week] = [date_in_qq].[week]
Group by [date_in_qq].[Week]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...