SQL-скрипт, использующий Q119, Q318-Q418 ссылки на меры.Любое предложенное улучшение кода - PullRequest
0 голосов
/ 11 июня 2019

Проблема заключается в ручном обновлении ссылок на сценарии Q119 и т. Д. Для перехода на следующий квартал.

Я работаю со сценарием, используя Q418, Q119 в качестве ссылок на показатели квартала, но это означает, что каждый новый квартал мне приходитсявручную измените Q119 на Q219, Q418 на Q119, Q318 на Q418 и так далее.Любые предложения по улучшению процесса.

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

SELECT S.REV, S.QUARTER
FROM SALES S
WHERE S.QUARTER IN('Q119','Q418')

Я ожидаю увидеть следующее:

REV   QUARTER
100   Q119
75    Q418
  • Реальноеданные, с которыми я работаю, намного сложнее, но для целей этого вопроса я хочу сохранить их простыми.
  • В идеале я хотел бы, чтобы скрипт использовал текущий квартал в качестве параметра и основывался на этом производном.предыдущие 8 кварталов и включите их в результат.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Вы можете создать список кварталов, используя список чисел:

Первым шагом было бы установить начальную дату (которая является первой из квартала), для этого я предположил год ипараметр четверти, но реально это может быть любой ввод:

например

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);
0 голосов
/ 11 июня 2019

Вы можете генерировать четверти, используя рекурсивный CTE. Например:

with qs as (
      select concat('Q', datename(quarter, getdate()), year(getdate()) % 100) as qy,1 as lev
      union all
      select concat('Q', datename(quarter, dateadd(quarter, - lev, getdate())), year(dateadd(quarter, - lev, getdate())) % 100) as qy, lev + 1
      from qs
      where lev < 8
     )
select s.rev, s.quarter
from sales s
where s.quarter in (select q from qs);
...