0

考虑以下名为“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 仪表板。

谢谢!

4

1 回答 1

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 以使其动态化,并将其加入您的表中。

于 2019-01-09T16:44:09.650 回答