Вы можете создать список кварталов, используя список чисел:
Первым шагом было бы установить начальную дату (которая является первой из квартала), для этого я предположил год ипараметр четверти, но реально это может быть любой ввод:
например
DECLARE @Quarter INT = 2,
@Year INT = 2019
SELECT DATEFROMPARTS(@year, (@Quarter * 3) - 2, 1);
Wil return
2019-04-01
Затем, используя нумерованный список (от 0-7), выможет вычесть четверть за один раз из этой даты начала и отформатировать дату, как вам будет угодно:
DECLARE @Quarter INT = 2,
@Year INT = 2019
SELECT Code = CONCAT('Q', DATEPART(QUARTER, QuarterStart), FORMAT(QuarterStart, 'yy')),
QuarterStart
FROM ( SELECT QuarterStart = DATEADD(QUARTER, - n.Number, DATEFROMPARTS(@year, (@Quarter * 3) - 2, 1))
FROM (VALUES (0),(1),(2),(2),(4),(5),(6),(7)) n (Number)
) q;
Вернет
Code QuarterStart
--------------------------
Q219 2019-04-01
Q119 2019-01-01
Q418 2018-10-01
Q418 2018-10-01
Q218 2018-04-01
Q118 2018-01-01
Q417 2017-10-01
Q317 2017-07-01
Если вам нужно продлить это за пределы 8 кварталов,Вы можете добавить дополнительные строки в конструктор значений таблицы или создать таблицу чисел.Подробнее об этом здесь: Создание набора или последовательности без циклов - часть 1
Если вам нужно включить это в ваш основной запрос, вы можете просто встроить его:
DECLARE @Quarter INT = 2,
@Year INT = 2019;
SELECT S.REV, S.QUARTER
FROM SALES S
WHERE EXISTS
( SELECT 1
FROM (SELECT QuarterStart = DATEADD(QUARTER, - n.Number, DATEFROMPARTS(@year, (@Quarter * 3) - 2, 1))
FROM (VALUES (0),(1),(2),(2),(4),(5),(6),(7)) n (Number)) q
WHERE s.QUARTER = CONCAT('Q', DATEPART(QUARTER, QuarterStart), FORMAT(QuarterStart, 'yy'))
)
Или вы можете использовать табличную переменную, если вам нужно повторно использовать кварталы в запросе:
DECLARE @Quarter INT = 2,
@Year INT = 2019;
DECLARE @Quarter TABLE (QuarterCode CHAR(4) NOT NULL PRIMARY KEY);
INSERT @Quarter (QuarterCode)
SELECT CONCAT('Q', DATEPART(QUARTER, QuarterStart), FORMAT(QuarterStart, 'yy'))
FROM ( SELECT QuarterStart = DATEADD(QUARTER, - n.Number, DATEFROMPARTS(@year, (@Quarter * 3) - 2, 1))
FROM (VALUES (0),(1),(2),(2),(4),(5),(6),(7)) n (Number)
) q;
SELECT S.REV, S.QUARTER
FROM SALES S
WHERE S.QUARTER IN (SELECT QuarterCode FROM @Quarter);