【问题标题】:Query to subtract the column value from same table查询从同一个表中减去列值
【发布时间】:2020-01-02 21:02:56
【问题描述】:

我通过以下查询得到以下输出。

SELECT TOTAL_ACTUAL_COST,SHIPMENT_GID, PERSPECTIVE
FROM SHIPMENT
WHERE SHIPMENT_GID IN
   (SELECT SHIPMENT_GID FROM SHIPMENT_STOP_D
    WHERE S_SHIP_UNIT_GID IN
        (SELECT S_SHIP_UNIT_GID FROM S_SHIP_UNIT_LINE
         WHERE ORDER_RELEASE_GID LIKE :ORDER_RELEASE_ID))

当我将 Order_Release_ID 作为 CT/PLI.KIKO3 传递时,我得到如下输出。

我想要一个字段作为利润(透视为“S”的总实际成本 - 透视为“B”的总实际成本),即在上述情况下,它将是(5980 -1020 = 4960)

请让我知道我需要在上述查询中进行哪些更改才能获得利润字段。

我真正想要的是从同一个表中减去列值。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以使用conditional aggregation,如下:

    SELECT
        SUM(CASE WHEN PERSPECTIVE = 'S' THEN TOTAL_ACTUAL_COST
        END) - SUM(CASE
            WHEN PERSPECTIVE = 'B' THEN TOTAL_ACTUAL_COST
        END) AS PROFIT,
        SHIPMENT_GID, 
        --PERSPECTIVE, 
        ORDER_RELEASE_ID
    FROM SHIPMENT
    WHERE SHIPMENT_GID IN
       (SELECT SHIPMENT_GID FROM SHIPMENT_STOP_D
        WHERE S_SHIP_UNIT_GID IN
            (SELECT S_SHIP_UNIT_GID FROM S_SHIP_UNIT_LINE
             WHERE ORDER_RELEASE_GID LIKE :ORDER_RELEASE_ID))
    GROUP BY SHIPMENT_GID, ORDER_RELEASE_ID
    

    干杯!!

    【讨论】:

      【解决方案2】:

      我不能说我是嵌套IN 逻辑的粉丝,所以我倾向于使用JOIN 和EXISTS 来写这篇文章。

      那么,如果你想要每个ORDER_RELEASE_ID 一行,那么条件聚合:

      SELECT s.ORDER_RELEASE_ID,
             SUM(CASE WHEN s.Perspective = 'S' THEN s.TOTAL_ACTUAL_COST
                      WHEN s.Perspective = 'B' THEN - s.SHIPMENT_GID
                 END) as Profit
      FROM SHIPMENT s
      WHERE EXISTS (SELECT 1
                    FROM SHIPMENT_STOP_D ss JOIN
                         S_SHIP_UNIT_LINE sul
                         USING (S_SHIP_UNIT_GID)
                    WHERE s.SHIPMENT_GID = ss.SHIPMENT_GID AND
                          sul.ORDER_RELEASE_GID LIKE :ORDER_RELEASE_ID
                   )
      GROUP BY s.ORDER_RELEASE_ID;
      

      如果您想要原始行以及额外的“利润”列,请使用分析函数:

      SELECT s.*,
             SUM(CASE WHEN s.Perspective = 'S' THEN s.TOTAL_ACTUAL_COST
                      WHEN s.Perspective = 'B' THEN - s.SHIPMENT_GID
                 END) OVER (PARTITION BY s.ORDER_RELEASE_ID) as Profit
      FROM SHIPMENT s
      WHERE EXISTS (SELECT 1
                    FROM SHIPMENT_STOP_D ss JOIN
                         S_SHIP_UNIT_LINE sul
                         USING (S_SHIP_UNIT_GID)
                    WHERE s.SHIPMENT_GID = ss.SHIPMENT_GID AND
                          sul.ORDER_RELEASE_GID LIKE :ORDER_RELEASE_ID
                   );
      

      【讨论】:

        【解决方案3】:

        试试这个

        /* here goes your initial query from the question */
        WITH src AS (SELECT TOTAL_ACTUAL_COST,SHIPMENT_GID, PERSPECTIVE
        FROM SHIPMENT
        WHERE SHIPMENT_GID IN (SELECT SHIPMENT_GID 
        FROM SHIPMENT_STOP_D
        WHERE S_SHIP_UNIT_GID IN
        (SELECT S_SHIP_UNIT_GID FROM S_SHIP_UNIT_LINE
        WHERE ORDER_RELEASE_GID LIKE :ORDER_RELEASE_ID))
        
        select src_s.total_actual_cost - src_b.total_actual_cost
        /* here any other fields you need */
        from src src_b,
        src src_s
        where src_s.order_release_id = src_b.order_release_id
        and src_b.PERSPECTIVE = 'B'
        and src_s.PERSPECTIVE = 'S'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多