oracle - 选择结果表中显示的列 - Oracle(未按预期工作)
问题描述
我有一个表名 TABLE1 有 4 列(ID、LINE、COST、CODE)
CREATE TABLE TABLE1 ( ID NUMBER(4), LINE NUMBER(3), COST NUMBER(4), CODE VARCHAR2(3) );
/*1st case:*/
INSERT INTO TABLE1 VALUES(101, 1, 40, 'ABC' );
INSERT INTO TABLE1 VALUES(101, 1, 50, 'DEF' );
/*2nd case:*/
INSERT INTO TABLE1 VALUES(102, 2, 30, 'CDE' );
INSERT INTO TABLE1 VALUES(102, 2, 20, 'ECD' );
/*3rd case:*/
INSERT INTO TABLE1 VALUES(103, 3, 5, 'BCD' );
INSERT INTO TABLE1 VALUES(103, 3, 5, 'BCD' );
/*4th case:*/
INSERT INTO TABLE1 VALUES(104, 4, 15, 'OPQ' );
INSERT INTO TABLE1 VALUES(104, 4, 15, 'PQO' );
ID LINE COST CODE
--------------------------
101 1 40 ABC
101 1 50 DEF
102 2 30 CDE
102 2 20 ECD
103 3 05 BCD
103 3 05 BCD
104 4 15 OPQ
104 4 15 PQO
从上表中可以看出,我对每条线路分别计算了每个 ID 的成本总和......
For ID = 101 and LINE = 1 -> SUM(COST) = 40+50 = 90
For ID = 102 and LINE = 2 -> SUM(COST) = 30+20 = 50
For ID = 103 and LINE = 3 -> SUM(COST) = 05+05 = 10
For ID = 104 and LINE = 4 -> SUM(COST) = 15+15 = 30
我有一个 TABLE2 有 6 列(ID、LINE、COST_PR、PR_CODE、COST_SC、SC_CODE)
CREATE TABLE TABLE2 ( ID NUMBER(4), LINE NUMBER(3), COST_PR NUMBER(4), PR_CODE VARCHAR2(3), COST_SC NUMBER(4), SC_CODE VARCHAR2(3) );
INSERT INTO TABLE2 VALUES(101, 1, 90, 'DFE', 100, 'CBA');
INSERT INTO TABLE2 VALUES(102, 2, 60, 'CDE', 50, 'EDC');
INSERT INTO TABLE2 VALUES(103, 3, 10, 'BCD', 10, 'DEF');
INSERT INTO TABLE2 VALUES(104, 4, 10, 'XYZ', 20, 'ZXY');
ID LINE COST_PR PR_CODE COST_SC SC_CODE
--------------------------------------------------------
101 1 90 DFE 100 CBA
102 2 60 CDE 50 EDC
103 3 10 BCD 10 DEF
104 4 10 XYZ 20 ZXY
我有一个包含 2 列(SEC、PIN)的 TABLE3
CREATE TABLE TABLE3( SEC VARCHAR2(3), PIN VARCHAR2(2) );
INSERT INTO TABLE3 VALUES ('ABC', 'A1' );
INSERT INTO TABLE3 VALUES ('DEF', 'A2' );
INSERT INTO TABLE3 VALUES ('CDE', 'A3' );
INSERT INTO TABLE3 VALUES ('ECD', 'A4' );
INSERT INTO TABLE3 VALUES ('BCD', 'A5' );
INSERT INTO TABLE3 VALUES ('OPQ', 'A7' );
INSERT INTO TABLE3 VALUES ('PQO', 'A8' );
INSERT INTO TABLE3 VALUES ('XYZ', 'B1' );
INSERT INTO TABLE3 VALUES ('ZXY', 'B2' );
INSERT INTO TABLE3 VALUES ('CBA', 'B3' );
INSERT INTO TABLE3 VALUES ('EDC', 'B4' );
INSERT INTO TABLE3 VALUES ('DFE', 'B5' );
SEC PIN
-------------
ABC A1
DEF A2
CDE A3
ECD A4
BCD A5
OPQ A7
PQO A8
XYZ B1
ZXY B2
CBA B3
EDC B4
DFE B5
上面的结果逻辑是
Case1:
From TABLE1, For ID = 101 & LINE = 1, SUM(COST) = 40+50 = 90
we need to compare this SUM(COST) with COST_PR and COST_SC of TABLE2,
In this case, SUM(COST) = COST_PR
so we need to
a) populate CODE values from TABLE1 and PR_CODE from TABLE2 in PR_CODE columns and
b) populate SC_CODE values from TABLE2 as it is in SC_CODE column
Case2:
From TABLE1, For ID = 102 & LINE = 2, SUM(COST) = 30+20 = 50
we need to compare this SUM(COST) with COST_PR and COST_SC of TABLE2,
In this case, SUM(COST) = COST_SC
so we need to
a) populate CODE values from TABLE1 and SC_CODE values from TABLE2 in SC_CODE columns and
b) populate PR_CODE values from TABLE2 as it is in PR_CODE columns
Case3:
From TABLE1, For ID = 103 & LINE = 3, SUM(COST) = 10
we need to compare this SUM(COST) with COST_PR and COST_SC of TABLE2,
In this case, SUM(COST) = COST_PR = COST_SC
so we need to
a) populate CODE values from TABLE1 and PR_CODE values from TABLE2 in PR_CODE columns and
b) populate CODE values from TABLE1 and SC_CODE values from TABLE2 in SC_CODE columns
Case4:
From TABLE1, For ID = 104 & LINE = 4, SUM(COST) = 30
we need to compare this SUM(COST) with COST_PR and COST_SC of TABLE2,
In this case, SUM(COST) <> COST_PR and SUM(COST)<> COST_SC
so we need to
a) populate PR_CODE values from TABLE2 in PR_CODE columns and
b) populate SC_CODE values from TABLE2 in SC_CODE columns of resultant table
一旦这个逻辑结束,我们将使用 INNER JOIN 和 TABLE3 两次(一次是在结果表中填充来自 TABLE3 的 PR_PIN 值,第二次是在结果表中填充来自 TABLE3 的 SC_PIN 值)
结果表就像
ID LINE PR_CODE PR_PIN SC_CODE SC_PIN
---------------------------------------------------
/*1st case*/
101 1 ABC A1 CBA B3
101 1 DEF A2 CBA B3
101 1 DFE A2 CBA B3
/*2nd case*/
102 2 CDE A3 CDE A3
102 2 CDE A3 ECD A4
102 2 CDE A3 EDC B4
/*3rd case*/
103 3 BCD A5 BCD A5
103 3 BCD A5 DEF A2
/*4th case*/
104 4 XYZ B1 ZXY B2
这是我使用的查询,它没有按预期工作......有人可以帮助我吗:
WITH tmp1 AS
(
SELECT DISTINCT t.*,
SUM(cost) OVER (PARTITION BY id, line) AS sum_code
FROM table1 t
)
SELECT t1.id, t1.line,
CASE
WHEN t2.cost_pr = t1.sum_code THEN t1.code
ELSE t2.pr_code
END AS pr_code,
CASE
WHEN t2.cost_pr = t1.sum_code THEN t31.pin
ELSE t32.pin
END AS pr_pin,
CASE
WHEN t2.cost_sc = t1.sum_code THEN t1.code
ELSE t2.sc_code
END AS sc_code,
CASE
WHEN t2.cost_sc = t1.sum_code THEN t31.pin
ELSE t33.pin
END AS sc_pin
FROM tmp1 t1
INNER JOIN table2 t2
ON t1.id = t2.id AND t1.line = t2.line
INNER JOIN table3 t31
ON t1.code = t31.sec
INNER JOIN table3 t32
ON t2.pr_code = t32.sec
INNER JOIN table3 t33
ON t2.sc_code = t33.sec;
结果表中不允许重复。如果有拼写错误,请告诉我....通过我的查询,我看到第 4 种情况按预期工作,但其余三种情况部分正确但不完全正确...有人可以帮助我吗
解决方案
推荐阅读
- python - 使用字典列表更新 SQL 表
- wordpress - Wordpress 联系表格 7 短代码不起作用
- javascript - javascripts 和下拉菜单在开发和生产模式下工作,但在部署到 Heroku 时都失败
- oracle - 如何在oracle中将所有约束和数据从一个模式复制到另一个模式
- node.js - Angular HTTP GET 未命中 Express Route
- entity-framework-core - 使用 Automap 以多对多关系将 ViewModel 映射到 Entity
- java - CompletableFuture的Java异步返回
- javascript - 使用 HERE MAPS API 从数据库导入标记
- python - 如何检查某些东西是否存在,然后创建并将其保存在数组中
- python - sklearn 中的 GridSearchCV 和 Pipeline 是否存在拟合差异?