SQL查询改写:按ID_PROD聚合求和并应用指定筛选条件
SQL查询改写需求
原查询语句
SELECT D.ID_STORAGE, D.QUIN, A.ID_PROD AS ID_PROD_FULL, SUBSTR(A.ID_PROD, 1, 4) AS ID_PROD, B.PROD_GROUP, A.REAL_WEIGHT, C.VALK, C.REV, C.STORAGE_TYPE, B.THEORETICAL_WEIGHT, B.THEORETICAL_WEIGHT * A.REAL_WEIGHT AS FINAL_WEIGHT FROM Table_a A, Table_b B, Table_c C, Table_d D WHERE C.STORAGE_TYPE = D.STORAGE_TYPE AND C.ID_STORAGE = D.ID_STORAGE AND C.ID_LINE = D.ID_LINE AND A.ID_PROD = C.ID_PROD AND B.ID_PROD = C.ID_PROD AND B.ID_PROD = A.ID_PROD AND A.NRT = C.NRT;
原查询返回结果
| ID_STORAGE | QUIN | ID_PROD_FULL | ID_PROD | PROD_GROUP | REAL_WEIGHT | VALK | REV | STORAGE_TYPE | THEORETICAL_WEIGHT | FINAL_WEIGHT |
|---|---|---|---|---|---|---|---|---|---|---|
| HESZ | Z | P001-IUU | P001 | NM | 0,34 | J | X | KO | 3 | 1,02 |
| HESZ | Z | P001-IUU | P001 | TT | 0,22 | J | X | KO | 3 | 0,66 |
| HESZ | Z | P002-IUY | P002 | NM | 0,11 | J | X | TO | 5 | 0,55 |
| FRES | Z | P002-IUY | P002 | NM | 0,45 | J | X | KO | 5 | 2,25 |
| FRES | Z | P002-ICX | P002 | BV | 0,77 | J | Y | WE | 5 | 1,54 |
改写需求
需要实现每个ID_PROD仅显示一行,包含以下内容:
- 该
ID_PROD的REAL_WEIGHT总和 - 该
ID_PROD对应的唯一THEORETICAL_WEIGHT - 总和与理论重量相乘得到的
FINAL_WEIGHT
同时仅对符合以下筛选条件的行进行计算:
STORAGE_TYPE为 KO、TO、ZPROD_GROUP为 NM、Z、SC.VALK为 J、C、D、EID_STORAGE为 HESZ、FRESD.QUIN为 Z、KC.REV为 X、Y、H
期望结果
| ID_PROD | REAL_WEIGHT | THEORETICAL_WEIGHT | FINAL_WEIGHT |
|---|---|---|---|
| P001 | 0,34 | 3 | 1,02 |
| P002 | 0,56 | 5 | 2,8 |
解决方案
改写后的SQL语句
SELECT SUBSTR(A.ID_PROD, 1, 4) AS ID_PROD, SUM(A.REAL_WEIGHT) AS REAL_WEIGHT, MAX(B.THEORETICAL_WEIGHT) AS THEORETICAL_WEIGHT, SUM(A.REAL_WEIGHT) * MAX(B.THEORETICAL_WEIGHT) AS FINAL_WEIGHT FROM Table_a A JOIN Table_c C ON A.ID_PROD = C.ID_PROD AND A.NRT = C.NRT JOIN Table_b B ON B.ID_PROD = C.ID_PROD JOIN Table_d D ON C.STORAGE_TYPE = D.STORAGE_TYPE AND C.ID_STORAGE = D.ID_STORAGE AND C.ID_LINE = D.ID_LINE WHERE -- 筛选条件 C.STORAGE_TYPE IN ('KO', 'TO', 'Z') AND B.PROD_GROUP IN ('NM', 'Z', 'S') AND C.VALK IN ('J', 'C', 'D', 'E') AND D.ID_STORAGE IN ('HESZ', 'FRES') AND D.QUIN IN ('Z', 'K') AND C.REV IN ('X', 'Y', 'H') GROUP BY SUBSTR(A.ID_PROD, 1, 4);
说明
- 显式JOIN替换隐式连接:将原查询的逗号分隔表写法改为显式
JOIN,逻辑更清晰,可读性更强。 - 分组聚合:通过
GROUP BY SUBSTR(A.ID_PROD, 1, 4)按ID_PROD分组,用SUM(A.REAL_WEIGHT)计算符合条件的重量总和。 - 获取唯一理论重量:由于每个
ID_PROD对应的THEORETICAL_WEIGHT是唯一值,用MAX(B.THEORETICAL_WEIGHT)确保正确获取该值(用MIN结果一致)。 - 计算最终重量:直接用重量总和乘以理论重量得到
FINAL_WEIGHT。 - 筛选条件整合:所有筛选条件统一加入
WHERE子句,确保仅处理符合要求的数据。
内容的提问来源于stack exchange,提问作者Req_7
相关产品推荐
相关产品推荐

