使一个 CASE WHEN 的 ELSE 等于同一 SELECT 子句中的另一个 CASE

问题描述 投票:0回答:1

如何使同一个 SELECT 子句中一个 CASE WHEN 的 ELSE 等于另一个 CASE?

在此示例中,成本下的 ELSE 0 等于收入。如果成本为 0,请使用上面的收入值。

SELECT
    subselect.item,
    SUM(subselect.Revenue)
    SUM(subselect.Cost)
FROM(
    Select
        item,
        item_price,
        quantity,
        Item_cost,
        SUM(CASE  
            WHEN (item in ('1','2','3'))
            THEN item_price * quantity
            ELSE 0
            END) AS REVENUE,
        SUM(CASE  
            WHEN (item in ('1','2','3'))
            THEN item_cost * quantity
            ELSE 0
            END) AS COST
    ) AS subselect
...

收入:

项目 商品价格 数量 收入
1 1 2 2
2 3 1 6
3 2 3 6

费用:

项目 商品成本 数量 成本
3 2 0 0

由于成本为 0,因此使用该项目的收入,在本例中为 6。

我正在针对 Oracle 数据库使用 PL SQL Developer。

sql oracle plsql subquery case
1个回答
0
投票

从您提供的数据看来,您根本不需要子选择,因为您可以使用 Case 表达式检查总成本并选择要选择的内容 - 成本或收入。

WITH    -- S a m p l e   D a t a :
    revenue (ITEM, ITEM_PRICE, QUANTITY, REVENUE)  AS
        ( Select 1, 1, 2, 2 From Dual UNION All
          Select 2, 3, 1, 6 From Dual UNION All
          Select 3, 2, 3, 6 From Dual ),
    cost (ITEM, ITEM_PRICE, QUANTITY, ITEM_COST)  AS
        ( Select 3, 2, 0, 0 From Dual )
--     M a i n   S Q L :
Select      r.ITEM,
            SUM(r.ITEM_PRICE * r.QUANTITY) AS REVENUE,
            Case SUM(c.ITEM_COST * c.QUANTITY) When 0 Then  SUM(r.ITEM_PRICE * r.QUANTITY)
            Else SUM(c.ITEM_COST * c.QUANTITY)
            End AS COST
From        revenue r 
Inner Join  cost c ON(c.ITEM = r.ITEM)
Group By    r.ITEM
/*  R e s u l t :
      ITEM    REVENUE       COST
---------- ---------- ----------
         3          6          6    */
© www.soinside.com 2019 - 2024. All rights reserved.