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