使用自身和另一列的总和更新现有值

时间:2017-08-07 18:34:56

标签: oracle sum

在Oracle中,我正在尝试使用自身和另一个模式/表中的1个值来更新值。以下是我到目前为止所尝试的无济于事。

UPDATE DEV02I2B2DEMODATA.partition_obs_2
SET COUNT = SUM(COUNT+CPT_COUNT)
WHERE prefix IN (SELECT concept_cd FROM 
PCORI_ETL_WEIGHT2.CONCEPT_COUNT_OBS_FACT_17Q1);

UPDATE 
(SELECT * FROM t1.partition_obs_2 D
JOIN t2.CONCEPT_COUNT_OBS_FACT_17Q1 P ON D.PREFIX = P.CONCEPT_CD
) D
SET D.COUNT = SUM(D.COUNT+P.CPT_COUNT)

每次我收到错误'ORA-00934:此处不允许群组功能'我不知道如何继续

两个表都包含2列

CREATE TABLE "DEV02I2B2DEMODATA"."PARTITION_OBS_2" 
(   "PREFIX" VARCHAR2(500 BYTE), 
"COUNT" NUMBER)

CREATE TABLE "PCORI_ETL_WEIGHT2"."CONCEPT_COUNT_OBS_FACT_17Q1" 
(   "CPT_COUNT" NUMBER, 
"CONCEPT_CD" VARCHAR2(50 BYTE))

一些示例数据,除了标题之外,两个表都是这样的。

PREFIX  COUNT
CPT:000 2077
CPT:001 90169
CPT:002 2626

我正在尝试将每个前缀的两个表中的count列相加并更新DEV02I2B2DEMODATA.PARTITION_OBS_2中的count列

任何建议都将不胜感激

谢谢, 艾伦

2 个答案:

答案 0 :(得分:0)

只需将SET部分转换为子查询。

UPDATE t1.partition_obs_2 A
SET A.COUNT = (SELECT SUM(D.COUNT+P.CPT_COUNT) FROM t1.partition_obs_2 D
JOIN t2.CONCEPT_COUNT_OBS_FACT_17Q1 P ON D.PREFIX = P.CONCEPT_CD)
WHERE prefix IN (SELECT concept_cd FROM 
PCORI_ETL_WEIGHT2.CONCEPT_COUNT_OBS_FACT_17Q1);

答案 1 :(得分:0)

看起来您希望使用子查询进行相关更新以从另一个表中获取总和:

UPDATE DEV02I2B2DEMODATA.partition_obs_2 po
SET COUNT = COUNT + (
  SELECT NVL(SUM(CPT_COUNT), 0)
  FROM PCORI_ETL_WEIGHT2.CONCEPT_COUNT_OBS_FACT_17Q1 ccof
  WHERE ccof.CONCEPT_ID = po.PREFIX
);

或者跳过NVL()但添加EXISTS子句以限制更新到另一个表中具有匹配数据的行;如果这个比例很低,那么进行检查可能比更新每一行更好。

使用您的表结构和一些组成的示例数据进行快速演示(为简单起见,所有这些都在一个模式中):

CREATE TABLE "PARTITION_OBS_2" 
(   "PREFIX" VARCHAR2(500 BYTE), 
"COUNT" NUMBER)
/

CREATE TABLE "CONCEPT_COUNT_OBS_FACT_17Q1" 
(   "CPT_COUNT" NUMBER, 
"CONCEPT_CD" VARCHAR2(50 BYTE))
/

insert into PARTITION_OBS_2 values ('CPT:000', 2077);
insert into PARTITION_OBS_2 values ('CPT:001', 90169);
insert into PARTITION_OBS_2 values ('CPT:002', 2626);

insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (1, 'CPT:001');
insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (1, 'CPT:001');
insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (1, 'CPT:001');
insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (2, 'CPT:002');
insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (5, 'CPT:002');

UPDATE partition_obs_2 po
SET COUNT = COUNT + (
  SELECT NVL(SUM(CPT_COUNT), 0)
  FROM CONCEPT_COUNT_OBS_FACT_17Q1 ccof
  WHERE ccof.CONCEPT_CD = po.PREFIX
);

3 rows updated.

column prefix format a20
select * from partition_obs_2;

PREFIX                    COUNT
-------------------- ----------
CPT:000                    2077
CPT:001                   90172
CPT:002                    2633