在Cognos中计算当日与前一日数值差异并生成目标透视表
解决方案:计算当日与前一日数值差异并生成透视表
第一步:先汇总每日数值
原始数据中同一天可能存在多条同Description的记录(比如2023-01-05的XXX有两个Value),所以首先需要按Description和Snapshot - Date做每日总Value的汇总。
SQL 汇总语句
WITH daily_summary AS ( SELECT Description, "Snapchot - Date" AS snapshot_date, SUM(Value) AS daily_value FROM your_table_name GROUP BY Description, "Snapchot - Date" )
第二步:获取前一日数值并计算差异
根据使用工具的不同,提供三种常用实现方式:
场景1:SQL实现
使用LAG()窗口函数,按Description分组、日期排序,直接获取前一日的汇总值:
SELECT Description, snapshot_date, daily_value, COALESCE(daily_value - LAG(daily_value) OVER (PARTITION BY Description ORDER BY snapshot_date), 0) AS diff FROM daily_summary ORDER BY Description, snapshot_date;
LAG()函数会提取同一分组内上一行的daily_valueCOALESCE()用于处理首日差异(无前置日期时差异设为0,匹配你的预期效果)
执行后得到结构化结果:
| Description | snapshot_date | daily_value | diff |
|---|---|---|---|
| XXX | 2023-01-05 | 250 | 0 |
| XXX | 2023-01-06 | 350 | 100 |
| XXX | 2023-01-07 | 200 | -150 |
场景2:Power BI实现
- 创建每日汇总度量值:
Daily Value = SUM('YourTable'[Value]) - 创建前一日数值度量值:
Previous Day Value = CALCULATE( [Daily Value], DATEADD('YourTable'[Snapchot - Date], -1, DAY) ) - 计算差异度量值:
Daily Diff = COALESCE([Daily Value] - [Previous Day Value], 0)
将Description设为行、Snapchot - Date设为列,拖入两个度量值调整布局,即可得到目标透视表。
场景3:Excel实现
- 制作基础透视表:行选
Description,列选Snapchot - Date,值选Value并设置为求和。 - 添加差异计算:比如2023-01-06的差异公式为
=C2-B2(B2为2023-01-05的汇总值,C2为2023-01-06的汇总值),首日差异直接填0。 - 调整透视表布局,将Value和Diff对应到每个日期下方即可。
你之前方法出错的原因
直接用add_days([Snapchot - Date]; -1)关联时,未先做每日汇总,导致原始数据中同一天的多条记录与前一日的多条记录形成多对多匹配,最终出现数值匹配错误。必须先按日期和Description汇总,再做日期关联才能保证匹配准确性。
内容的提问来源于stack exchange,提问作者Max1502
相关产品推荐
相关产品推荐

