1

我正在尝试从视图 MYVIEW1 和 MYVIEW2 将一些字段插入到 MYTABLE 中,然后从参数(这是存储过程的一部分)为 UPDATED_BY 添加一个值,为 UPDATED_ON 添加一个值。如何使用 INSERT SELECT 或其他方式正确地做到这一点?

MYVIEW1    
+------+----+-----+-----------+---------+
|   YR | MO | QTR | USER_CODE | MO_PERF |
+------+----+-----+-----------+---------+
| 2012 |  1 |   1 |      1099 |      89 | 
| 2012 |  2 |   1 |      1099 |      86 |
| 2012 |  3 |   1 |      1099 |      95 |
+------+----+-----+-----------+---------+
MYVIEW2    
+------+-----+-----------+----------+
|   YR | QTR | USER_CODE | QTR_PERF |
+------+-----+-----------+----------+
| 2012 |   1 |      1099 |       90 | 
+------+-----+-----------+----------+

MYTABLE
+------+-----+-----------+---------+---------+---------+---------+-------------+------------+
|   YR | QTR | USER_CODE | MO1_PCT | MO2_PCT | MO3_PCT |     INC |  UPDATED_BY | UPDATED_ON |
+------+-----+-----------+---------+---------+---------+---------+-------------+------------+
| 2012 |   1 |      1099 |      89 |      86 |      95 |    7000 | SAMPLE NAME | 01/16/2013 |
+------+-----+-----------+---------+---------+---------+---------+-------------+------------+

INSERT INTO MYTABLE
 (YR,QTR,USER_CODE,MO1_PCT,MO2_PCT,MO3_PCT,INC,UPDATED_BY,UPDATED_ON)
    SELECT b.YR,b.QTR,b.USER_CODE,b.MO1_PCT,b.MO2_PCT,b.MO3_PCT,c.INC
    FROM MYVIEW1 b,
         MYVIEW2 c

如何插入(QTR 的 MO_PERF 的第一个月)作为 MO1_PCT 和(QTR 的 MO_PERF 的第二个月)作为 MO2_PCT 和(QTR 的 MO_PERF 的最后一个月)作为 MO3_PCT,确保我在正确的季度内插入了正确的月份和年。然后检查每个月的 MO_PERF 值是否至少达到 85,否则将 INC 设置为 NULL。

,CASE WHEN MO1_PCT>=85 AND MO2_PCT>=85 AND MO3_PCT>=85 THEN 7000
ELSE NULL 
END INC
4

1 回答 1

3

如果您使用的是 oracle 11g,那么您可以像这样使用PIVOT

select YR, QTR, USER_CODE, "1_MO_PCT" MO1_PCT, "2_MO_PCT" MO2_PCT, "3_MO_PCT" MO3_PCT ,
case when "1_MO_PCT" >= 85 and "2_MO_PCT" >= 85 and "2_MO_PCT" >= 85 then 7000 end INC,
user updated_by, sysdate  updated_on
from (
select m1.yr, m1.mo, m1.qtr, m1.user_code, m1.mo_perf, m2.qtr_perf
from myview1 m1 join myview2 m2 on m1.yr=m2.yr 
and m1.qtr = m2.qtr and m1.user_code = m2.user_code )t
pivot(
  max(mo_perf) MO_PCT  for mo in (1,2,3)
  )

这是一个 sqlfiddle 演示

于 2013-01-17T05:41:15.577 回答