首页 > 解决方案 > 仅对 Oracle SQL 中特定条件的字段求和

问题描述

我正在尝试从表格中获取金额,我想将满足特定条件的一些金额相加,同时保留未满足条件的其他金额。

我正在尝试这个解决方案,但即使它符合条件,它仍然无法总结。

SELECT
  price_type,
  CASE trim(price_type)
    WHEN 'TYPE1' THEN sum(bill_amt)
    ELSE bill_amt
  END bill_amt
FROM (
  SELECT 
    price_type,
    bill_amt
  FROM price_val_tbl
)
GROUP BY price_type, bill_amt

预期输出:

PRICE_TYPE   BILL_AMT
==========   ========
TYPE1        50
TYPE2        100
TYPE2        200

实际输出

PRICE_TYPE   BILL_AMT
==========   ========
TYPE1        100
TYPE1        -50
TYPE2        100
TYPE2        200

标签: sqloracleoracle-sqldeveloper

解决方案


这是您想要的情况UNION ALL

SELECT price_type, SUM(bill_amt)
FROM price_val_tbl
WHERE trim(price_type) = 'TYPE1'
GROUP BY price_type
UNION ALL
SELECT price_type, bill_amt
FROM price_val_tbl
WHERE trim(price_type) <> 'TYPE1';

您需要的原因UNION ALL是因为您在每一行上都没有唯一标识符。您可以像这样使用子查询和聚合:

SELECT MIN(price_type) as price_type,
       SUM(bill_amt) as billL_amt
FROM (SELECT pv.*, rownum as rn
      FROM price_val_tbl pv
     ) pv
GROUP BY (CASE WHEN trim(price_type) = 'TYPE1' THEN -1 ELSE rn END) ;

但是,它在做什么还不太清楚。


推荐阅读