如何在oracle中使用union做减法

问题描述 投票:0回答:1
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))

enter image description here

你好,我正在使用UNION,想在A列上减去这两个值,有什么办法吗?就像SUM的反义词一样,我在google上找过,但找不到任何答案。

oracle plsql union
1个回答
2
投票

有很多方法

其中一种方式是通过*-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))
© www.soinside.com 2019 - 2024. All rights reserved.