Sql 计算同一列中记录的差异

Sql 计算同一列中记录的差异,sql,oracle11g,Sql,Oracle11g,我有一张如下的桌子 DATE DIVISION KPI ACTUAL 01-07-2014 HYDRO 1 100 01-07-2014 HYDRO 2 200 01-07-2014 HYDRO 3 300 01-07-2014 HYDRO 4 400 01-07-2014 THERMAL 1 500 01-07-2014 THERMAL 2 600

我有一张如下的桌子

DATE        DIVISION            KPI      ACTUAL
01-07-2014  HYDRO       1   100
01-07-2014  HYDRO       2   200
01-07-2014  HYDRO       3   300
01-07-2014  HYDRO       4   400
01-07-2014  THERMAL     1   500
01-07-2014  THERMAL     2   600
01-07-2014  THERMAL     3   700
01-07-2014  THERMAL     4   800
WHEN KPI IS 1, THEN ACTUAL.
WHEN KPI IS 2, THEN DIVIDE KPI 2/KPI 1 OF ACTUAL.   200/100 =2 
WHEN KPI IS 3, THEN DIVIDE KPI 4/ KPI 3 OF ACTUAL.  400/300 = 1.33
WHEN KPI IS 4, THEN ACTUAL.
我的要求如下

DATE        DIVISION            KPI      ACTUAL
01-07-2014  HYDRO       1   100
01-07-2014  HYDRO       2   200
01-07-2014  HYDRO       3   300
01-07-2014  HYDRO       4   400
01-07-2014  THERMAL     1   500
01-07-2014  THERMAL     2   600
01-07-2014  THERMAL     3   700
01-07-2014  THERMAL     4   800
WHEN KPI IS 1, THEN ACTUAL.
WHEN KPI IS 2, THEN DIVIDE KPI 2/KPI 1 OF ACTUAL.   200/100 =2 
WHEN KPI IS 3, THEN DIVIDE KPI 4/ KPI 3 OF ACTUAL.  400/300 = 1.33
WHEN KPI IS 4, THEN ACTUAL.
上述计算对于每个分区都是相同的

请给出编写SQL以达到要求的价值建议

谢谢, 拉吉


您可能必须按更改分区,但看起来您需要为每个日期/日期组合进行计算。

您需要一个case语句以及各种kpi值。我会使用解析函数来实现这一点:

select t.*,
       (case when kpi = 1 then actual
             when kpi = 2 then actual / actual1
             when kpi = 3 then actual / actual4
             when kpi = 4 then actual
        end)
from (select t.*,
             max(case when kpi = 1 then actual end) over (partition by date, division) as actual1,
             max(case when kpi = 4 then actual end) over (partition by date, division) as actual4
      from table t
     ) t