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
);