Избегайте ручного создания столбцов в Teradata SQL - PullRequest
0 голосов
/ 09 января 2019

Рассмотрим следующее представление Teradata с именем «VIEW», которое состоит из данных транзакций.

ATTR1 ATTR2  DATE1       DATE2      WEEK1   WEEK2 AMOUNT

A       B   1/1/2019    1/8/2019    201901  201902  10
A       B   12/26/2018  1/8/2019    201852  201902  20
A       B   1/1/2019    1/15/2019   201901  201903  30
A       B   1/8/2019    1/15/2019   201902  201903  30

DATE1 - дата проводки, а DATE2 - дата клиринга транзакции. WEEK1 и WEEK2 - это финансовые недели DATE1 и DATE2 соответственно. ATTR - это случайные атрибуты транзакции. Мне нужно сообщать суммы транзакций по неделям для атрибутов.

Например, для недели 201901 мы хотели бы видеть суммы транзакций дат проводки до и до недели 201901 и даты клиринга после 201901. См. Код ниже.

select ATTR1,
       ATTR2,
       SUM(CASE WHEN WEEK2 > 201852 AND WEEK1 <= 201852 THEN AMOUNT END) AS AMT_201852,
       SUM(CASE WHEN WEEK2 > 201901 AND WEEK1 <= 201901 THEN AMOUNT END) AS AMT_201901,
       SUM(CASE WHEN WEEK2 > 201902 AND WEEK1 <= 201902 THEN AMOUNT END) AS AMT_201902,
FROM VIEW
GROUP BY 1,2

Результат:

ATTR1   ATTR2   AMT_201852  AMT_201901  AMT_201902
A        B          20          60          60

Как показывает приведенный выше код, нам приходится вручную создавать столбцы для каждой недели, которых мы хотели бы избежать. Есть ли способ динамически создавать эти столбцы с течением недель? Или есть лучший способ представить это? В отчете использование WEEK1 в качестве фильтра отфильтрует предыдущие недели (в случае WEEK1 как 201901, 201852 будет отфильтровано и потеряет соответствующие суммы). В конце концов мы поместили этот SQL в панель инструментов PowerBI.

Спасибо!

1 Ответ

0 голосов
/ 09 января 2019

Вам придется немного повозиться с этим, но это должно привести вас в правильном направлении. Teradata имеет чрезвычайно полезный встроенный просмотр даты: sys_calendar.calendar

Это, например, даст вам последние три недели в том формате, в котором они были указаны в ваших данных выборки (ГГГГ):

select
    distinct week_of_year,
    year_of_calendar,
    (year_of_calendar * 100) + week_of_year as year_week
from
sys_calendar.calendar
where
calendar_date between  (current_date - interval '21' day) and current_date
order by year_week

Вы должны иметь возможность заменить current_date параметром, чтобы сделать это динамическим, и присоединить его к вашей таблице.

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