Как я могу увидеть, как в определенный момент времени происходит пятинедельный счет различных значений? - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь увидеть момент времени, когда количество оплачиваемых сотрудников за пять недель изменилось. Например, на 48 неделе мне нужно было бы увидеть количество отдельных сотрудников, оплачиваемых за недели с 44 по 48. Я думаю, что мне нужно включить что-то вроде «WHERE Week_Number BETWEEN Week_Number -5 AND Week_Number», но я не уверен, как это сделать . На выходе должны быть только год, номер недели и количество различных идентификаторов сотрудников.

SELECT Week_Number,
    Year, 
Account, 
count(distinct EmployeeID as 'EmployeeCount'
FROM [Table]
GROUP BY Week_Number, Year, Account

1 Ответ

0 голосов
/ 27 мая 2020

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

YearNumber | WeekNumber | Account | EmployeeID
----------------------------------------------
2019       | 51         | 101     | 1         
2019       | 48         | 101     | 2         

И вот результат, который вы хотите увидеть:

YearNumber | WeekNumber | Account | Quantity
----------------------------------------------
2019       | 48         | 101     | 1         
2019       | 49         | 101     | 1 
2019       | 50         | 101     | 1 
2019       | 51         | 101     | 2 
2019       | 52         | 101     | 2 
2020       | 1          | 101     | 1 
2020       | 2          | 101     | 1 
2020       | 3          | 101     | 1 

Итак, один человек начинает платить на 48 неделе. , один на 51, что означает, что их платежи на счете 101 перекрываются на 51 и 52 неделе, но в другие недели только один человек платит на счет.

Чтобы также ответить на ваш вопрос в комментарии: это - Я думаю, это хороший способ предоставить образец данных и ожидаемый результат, когда вы спросите о SO.


Запрос, который помог мне получить результаты выше:

SELECT 
    d.Year + IIF((d.Week + n.Number - 1) >= 52, 1, 0) AS Year, 
    (d.Week + n.Number - 1) % 52 + 1 AS Week,
    d.AccountID,
    COUNT(d.EmployeeID) AS Quantity
FROM Data d
CROSS APPLY (SELECT * FROM Number n WHERE Number BETWEEN 0 AND 4) n
GROUP BY
    d.Year + IIF((d.Week + n.Number - 1) >= 52, 1, 0),  -- Year
    (d.Week + n.Number - 1) % 52 + 1,  -- Week
    d.AccountID

Это использует Числовую таблицу , которая в основном представляет собой таблицу, содержащую числа - очень помогает в подобных запросах. Код также имеет минимальную обработку для смены года, но имейте в виду, что вам может понадобиться заботиться о годах, содержащих 53 недели .

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