如何使用Oracle SQL比较多列中相同列中的数值

时间:2014-09-26 17:48:48

标签: sql oracle

我有一个视图,它结合了具有这种结构的3个表的数据。

TABLE    PERIOD  COUNTRY  CODE  POSITION  OCT_14  NOV_14  DEC_14
TABLE_1  Q1      UK       123   EMPL      .2      .2      .2
TABLE_2  Q1      Uk       123   EMPL      .2      .2      .2
TABLE_3  Q1      UK       123   EMPL      .3      .4      .4

我要做的是将TABLE_3行与TABLE_1和TABLE_2进行比较,以获取OCT_14,NOV_14和DEC_14列。如果TABLE_3的数值是>比TABLE_1或2更希望它返回某种类型的标记,如'注意'。

就期望的输出而言,我可以拥有一个具有唯一名称的新行或一个新列,例如OCT_14_R。实际上首选新行。

TABLE    PERIOD  COUNTRY  CODE  POSITION  OCT_14  OCT_14_R     NOV_14  DEC_14
TABLE_1  Q1      UK       123   EMPL      .2                    .2      .2
TABLE_2  Q1      Uk       123   EMPL      .2                    .2      .2
TABLE_3  Q1      UK       123   EMPL      .3       Attn         .4      .4

OR

TABLE    PERIOD  COUNTRY  CODE  POSITION  OCT_14  NOV_14  DEC_14
TABLE_1  Q1      UK       123   EMPL      .2      .2      .2
TABLE_2  Q1      Uk       123   EMPL      .2      .2      .2
TABLE_3  Q1      UK       123   EMPL      .3      .4      .4
Comparison                                 attn    attn    attn

2 个答案:

答案 0 :(得分:0)

您可以使用窗口功能,例如

SELECT a.*, 
CASE 
  WHEN (a.oct_14 <> MIN(a.oct_14) OVER(PARTITION BY CODE ORDER BY "TABLE" 
  RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING) THEN 'attn' END as oct_14_r
FROM your_view a;

我假设&#34;表+代码&#34;唯一(否则您需要更改PARTITION BY)和..._ 14列不可为空。 &#34; oct_14_r&#34;会有&#39; attn&#39;当前行列不等于最小值2&#34;之前&#34; (按&#34; TABLE&#34;字段排序)行。

注意可能的性能问题 - 您正在使用视图,优化器可能会生成使用窗口/分析函数的错误执行计划查询

答案 1 :(得分:0)

Create Table V(TName VARCHAR(5), Oct_14 NUMBER(5,2), Nov_14 NUMBER(5,2), Dec_14 NUMBER(5,2));

Insert into V values('T1', 1.2, 1.2, 1.2);
Insert into V values('T2', 1.4, 1.5, 1.6);
Insert into V values('T3', 1.5, 1.5, 1.7);

SELECT TName, To_Char(Oct_14) Oct_14, To_Char(Nov_14) Nov_14, To_Char(Dec_14) Dec_14 from V
UNION
SELECT 'Compare', 
(select 'ATTN' from dual where EXISTS (select 1 from V where TName = 'T3' and OCT_14 > ALL(SELECT OCT_14 FROM V WHERE TName IN ('T1','T2')))) Oct_14_Res,
(select 'ATTN' from dual where EXISTS (select 1 from V where TName = 'T3' and Nov_14 > ALL(SELECT Nov_14 FROM V WHERE TName IN ('T1','T2')))) Nov_14_Res,
(select 'ATTN' from dual where EXISTS (select 1 from V where TName = 'T3' and Dec_14 > ALL(SELECT Dec_14 FROM V WHERE TName IN ('T1','T2')))) Dec_14_Res
FROM dual;

还有其他方法可以做得更好。