仅在 Oracle 中的特定条件下对字段求和 SQL

Sum a field only on specific conditions in Oracle SQL

我正在尝试从 table 中获取金额,其中我想对满足特定条件的一些金额求和,同时保留未满足条件的其他金额。

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

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

这是你想要的情况 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) ;

然而,这并不清楚它在做什么。

您还可以使用条件 GROUP BY,如下所示:

SQL> SELECT A, SUM(B)
  2  FROM YOUR_DATA
  3  GROUP BY A, ( CASE WHEN A = 'T1' THEN A ELSE TO_CHAR(ROWNUM) END);

A      SUM(B)
-- ----------
T2        100
T2        200
T1         50

SQL>