powerbi - 避免在 Teradata SQL 中手动创建列
问题描述
考虑以下名为“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 仪表板。
谢谢!
解决方案
您将不得不对此进行一些处理,但这应该可以使您朝着正确的方向前进。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 以使其动态化,并将其加入您的表中。
推荐阅读
- swift - 我在代码中的某个地方得到一个 nil 值,我不确定它在哪里以及如何修复它
- apache-spark - 无法广播大于 8GB 的表:Spark 2.3
- python-3.x - 在 state_dict 中加载 Pytourch 3.0 模型意外键“module.features.0.weight”时出现问题
- angularjs - 一条路线有效,但其他两条无效(使用 AngularJS 和 RouteProvider)
- r - 使用 "\n" 在 knitr::kable 表格单元格中换行
- swift - Swift 4.2 闭包
- uml - 有谁知道面向方面建模的工具
- python - 在 Python 中获取我的 sklearn 多项式回归模型的系数
- vue.js - 如何在 vuejs 中使用 jest 捕获外部库的元素?
- hyperledger-fabric - Hyperledger Composer 中模型(.cto 文件)的必填字段验证器