oracle - 如何在oracle中使用union进行减法
问题描述
SELECT A
FROM (
SELECT TRUNC(SUM(NVL(B.RMN_WGT,0))) as A --247011
FROM RE_STOCK_TB B
WHERE B.COMPANY_ID = :P_COMPANY_ID
AND ( B.COMPANY_ID, B.INPUT_NO, B.STOCK_DATE )
IN ( SELECT /*+ INDEX_DESC( RE_STOCK_TB RE_STOCK_PK ) */
COMPANY_ID, INPUT_NO, STOCK_DATE
FROM RE_STOCK_TB
WHERE COMPANY_ID = B.COMPANY_ID
AND INPUT_NO = B.INPUT_NO
AND STOCK_DATE <= :P_KEY_DATE
AND ROWNUM = 1
)
AND B.RMN_WGT > 0
AND B.GOODS_CD IN ('PG') --('PG','CC','CK')
AND B.STEEL_KIND_CD IN ('304') --('304','201')
UNION
SELECT TRUNC(SUM(NVL(B.RMN_WGT,0))) --246385
FROM RE_STOCK_TB B
WHERE B.COMPANY_ID = :P_COMPANY_ID
AND ( B.COMPANY_ID, B.INPUT_NO, B.STOCK_DATE )
IN ( SELECT /*+ INDEX_DESC( RE_STOCK_TB RE_STOCK_PK ) */
COMPANY_ID, INPUT_NO, STOCK_DATE
FROM RE_STOCK_TB
WHERE COMPANY_ID = B.COMPANY_ID
AND INPUT_NO = B.INPUT_NO
AND STOCK_DATE <= :P_KEY_DATE
AND ROWNUM = 1
)
AND B.RMN_WGT > 0
AND B.GOODS_CD IN ('PG') --('PG','CC','CK')
AND B.STEEL_KIND_CD IN ('304') --('304','201')
AND B.SIZE1 IN (0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.5, 2.0))
您好,我正在使用 UNION 并想在 A 列中减去这两个值。有什么办法吗?与 SUM 相反。我在谷歌上看过但找不到任何答案..
解决方案
有很多方法
一种方法是 * -1 用于联合后选择的列 A
SELECT SUM(A)
FROM (
SELECT TRUNC(SUM(NVL(B.RMN_WGT,0))) as A --247011
FROM RE_STOCK_TB B
WHERE B.COMPANY_ID = :P_COMPANY_ID
AND ( B.COMPANY_ID, B.INPUT_NO, B.STOCK_DATE )
IN ( SELECT /*+ INDEX_DESC( RE_STOCK_TB RE_STOCK_PK ) */
COMPANY_ID, INPUT_NO, STOCK_DATE
FROM RE_STOCK_TB
WHERE COMPANY_ID = B.COMPANY_ID
AND INPUT_NO = B.INPUT_NO
AND STOCK_DATE <= :P_KEY_DATE
AND ROWNUM = 1
)
AND B.RMN_WGT > 0
AND B.GOODS_CD IN ('PG') --('PG','CC','CK')
AND B.STEEL_KIND_CD IN ('304') --('304','201')
UNION
SELECT TRUNC(SUM(NVL(B.RMN_WGT,0))) * -1 --246385
FROM RE_STOCK_TB B
WHERE B.COMPANY_ID = :P_COMPANY_ID
AND ( B.COMPANY_ID, B.INPUT_NO, B.STOCK_DATE )
IN ( SELECT /*+ INDEX_DESC( RE_STOCK_TB RE_STOCK_PK ) */
COMPANY_ID, INPUT_NO, STOCK_DATE
FROM RE_STOCK_TB
WHERE COMPANY_ID = B.COMPANY_ID
AND INPUT_NO = B.INPUT_NO
AND STOCK_DATE <= :P_KEY_DATE
AND ROWNUM = 1
)
AND B.RMN_WGT > 0
AND B.GOODS_CD IN ('PG') --('PG','CC','CK')
AND B.STEEL_KIND_CD IN ('304') --('304','201')
AND B.SIZE1 IN (0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2,
1.5, 2.0))
或者通过添加一个代理列来进行条件总和以进行标记
SELECT SUM(IIF(A = 2, A * -1, A)
FROM (
SELECT TRUNC(SUM(NVL(B.RMN_WGT,0))) as A, '1' AS FLAG --247011
FROM RE_STOCK_TB B
WHERE B.COMPANY_ID = :P_COMPANY_ID
AND ( B.COMPANY_ID, B.INPUT_NO, B.STOCK_DATE )
IN ( SELECT /*+ INDEX_DESC( RE_STOCK_TB RE_STOCK_PK ) */
COMPANY_ID, INPUT_NO, STOCK_DATE
FROM RE_STOCK_TB
WHERE COMPANY_ID = B.COMPANY_ID
AND INPUT_NO = B.INPUT_NO
AND STOCK_DATE <= :P_KEY_DATE
AND ROWNUM = 1
)
AND B.RMN_WGT > 0
AND B.GOODS_CD IN ('PG') --('PG','CC','CK')
AND B.STEEL_KIND_CD IN ('304') --('304','201')
UNION
SELECT TRUNC(SUM(NVL(B.RMN_WGT,0))), '2' AS FLAG --246385
FROM RE_STOCK_TB B
WHERE B.COMPANY_ID = :P_COMPANY_ID
AND ( B.COMPANY_ID, B.INPUT_NO, B.STOCK_DATE )
IN ( SELECT /*+ INDEX_DESC( RE_STOCK_TB RE_STOCK_PK ) */
COMPANY_ID, INPUT_NO, STOCK_DATE
FROM RE_STOCK_TB
WHERE COMPANY_ID = B.COMPANY_ID
AND INPUT_NO = B.INPUT_NO
AND STOCK_DATE <= :P_KEY_DATE
AND ROWNUM = 1
)
AND B.RMN_WGT > 0
AND B.GOODS_CD IN ('PG') --('PG','CC','CK')
AND B.STEEL_KIND_CD IN ('304') --('304','201')
AND B.SIZE1 IN (0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2,
1.5, 2.0))
推荐阅读
- javascript - 在使用嵌套上下文的 React 中,如何防止子上下文在父上下文更新时重新呈现?
- asp.net - asp.net 如何将查询生成的列表框值传输到另一个列表框而不会出现 NullReferenceException 错误?
- powershell - switch 语句不匹配所有条件
- php - Laravel each() 函数已被弃用 PHP 7.3 - 它可以被覆盖吗?
- python - 如何在列中重复熊猫系列
- python - 如何订购由十进制字段设置的过滤 django 查询
- c# - EF Like 运算符用法
- excel - 仅保留当天最后一次运行的结果
- matlab - 在 Matlab 中绘制公式时矩阵尺寸不一致
- python - 使用装饰器按特定条件排序 - python