【问题标题】:Finding Difference between two rows grouped by a date or between two pivoted columns查找按日期分组的两行之间或两个透视列之间的差异
【发布时间】:2019-04-25 15:11:56
【问题描述】:

我的 OBIEE 报告中有两个不同日期的一组值:

------------------------------------------------------------------
Option   Date     Value 
------|---------|-------
OPT1    Date 1    5     
OPT1    Date 2    2     
OPT2    Date 1    9     
OPT2    Date 2    1     
OPT3    Date 1    7     
OPT3    Date 2    13    
OPT4    Date 1    5     
OPT4    Date 2    6   

我希望得到每组日期之间的Values差异,并按以下格式呈现数据,按选项分组:

Option  Date               Diff
        Date 1   Date 2 
------|--------|--------|-------  
OPT1    5        2        3
OPT2    9        1        8
OPT3    7        13       -6
OPT4    5        6        -1

可以使用 Pivot 处理日期部分,但是我无法找到现在旋转的列之间的差异。

我相信,如果在一组日期(如下所示)中找到两个值之间的差异,然后进行旋转,它可能会起作用,但我无法找到一组日期的差异。

Option  Date      Value   Diff
-------|---------|-------|-------
OPT1    Date 1    5       null
OPT1    Date 2    2        3
OPT2    Date 1    9       null
OPT2    Date 2    1        8
OPT3    Date 1    7       null
OPT3    Date 2    13       -6
OPT4    Date 1    5       null 
OPT4    Date 2    6       -1

感谢任何帮助。

谢谢, 朱奈德

【问题讨论】:

  • 请编辑您的问题,以包含您用于透视数据的查询。
  • 另外,您如何知道哪些日期 1 行链接到日期 2 行?有列可以链接它们。
  • @JunaidAhmad 。 . . SQL 表代表 无序 集。没有排序,除非列指定排序。而且你好像没有这样的专栏。
  • 我已经编辑了我的问题。添加了一个列来链接日期。有用吗?
  • 只是为了增加我的 10 美分 - 这不是 OBIEE 的构建方式,也不是它的工作方式。 OBI 使用模型。您不是在编写 SQL 查询。

标签: sql oracle oracle11g obiee


【解决方案1】:

您可以参考和使用枢轴子句生成的列进行计算。假设您有一些键值链接日期 1 和 2 的值对,您可以执行以下操作:

-- CTE for sample data, with made-up keys
with your_table (some_key, some_date, value) as (
            select 1, date '2019-04-01', 5 from dual
  union all select 1, date '2019-04-15', 2 from dual
  union all select 2, date '2019-04-01', 9 from dual
  union all select 2, date '2019-04-15', 1 from dual
  union all select 3, date '2019-04-01', 7 from dual
  union all select 3, date '2019-04-15', 13 from dual
  union all select 4, date '2019-04-01', 5 from dual
  union all select 4, date '2019-04-15', 6 from dual
)
-- actual query
select some_key, date1, date2, date1 - date2 as diff
from your_table
pivot (max(value) for some_date in (date '2019-04-01' as date1, date '2019-04-15' as date2))
order by some_key;

  SOME_KEY      DATE1      DATE2       DIFF
---------- ---------- ---------- ----------
         1          5          2          3
         2          9          1          8
         3          7         13         -6
         4          5          6         -1

date1 - date2 as diff 表达式中,date1date2 是来自枢轴的名称/别名。您通常不能在定义它的同一查询级别中使用列别名,但 pivot 可以让您摆脱它。

【讨论】:

    【解决方案2】:

    好的,我想我得到了按选项分区进行逐行减法的解决方案

    VALUE - LAG(VALUE, 1, NULL) OVER (PARTITION BY OPTION ORDER BY OPTION)

    但是,由于某些限制,我无法在 OBIEE 中使用数据库功能。我想了解一个不涉及使用 DB 函数(如 LAG/LEAD)的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 2011-10-29
      相关资源
      最近更新 更多