避免在Teradata SQL中手动创建列

时间:2019-01-08 23:05:14

标签: powerbi teradata teradata-sql-assistant

请考虑以下名为“ VIEW”的Teradata视图,该视图由事务性数据组成。

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 :(得分:0)

您必须对此稍加弄乱,但这应该可以使您朝正确的方向前进。 Teradata内置了一个非常有用的日期视图:sys_calendar.calendar

例如,这将为您提供过去三周的样本数据格式(YYYYWW):

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来使其动态化,并将其连接到表中。