查找按日期分组的两行之间或两个透视列之间的差异

时间:2019-04-25 15:11:56

标签: sql oracle oracle11g obiee

我的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   

我希望获得各组日期之间的值差,并以以下格式显示数据,并按选项分组:

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

可以使用Pivot处理Date部分,但是我无法找到现在的透视列之间的区别。

我相信,如果为一个日期集找到两个值之间的差异(如下所示),然后对其进行透视,则可能会成功,但我找不到一组差异。

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

感谢您的帮助。

谢谢, 朱奈德

2 个答案:

答案 0 :(得分:0)

您可以引用数据透视子句生成的列并使用它们进行计算。假设您有一些键值链接日期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是枢轴的名称/别名。通常,您无法在定义它的同一级查询中使用列别名,但可以通过透视操作来摆脱它。

答案 1 :(得分:0)

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

值-LAG(VALUE,1,NULL)超过(按选项划分或按选项划分)

但是,由于某些限制,我无法在OBIEE中使用DB函数。我想学习一种不涉及使用DB函数(例如LAG / LEAD)的解决方案。