Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以从同一表中减去列值_Sql_Oracle - Fatal编程技术网

Sql 查询以从同一表中减去列值

Sql 查询以从同一表中减去列值,sql,oracle,Sql,Oracle,我有下面的输出和下面的查询 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_

我有下面的输出和下面的查询

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))
当我将订单发布ID作为CT/PLI.KIKO3传递时,我得到如下输出

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

请让我知道我需要在上面的查询中做什么更改才能获得利润字段

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


您可以使用条件聚合,如下所示:

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
干杯

试试这个

/* 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'

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

然后,如果您希望每个
订单发布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
             );