仅在oracle sql中的特定条件下对字段求和

ukdjmx9f  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(398)

我试着从一个表中得到金额,在这个表中,我想对一些满足特定条件的金额求和,而如果不满足条件,则保留其他金额的未求和金额。
我试过这个解决方案,但即使它满足条件,它仍然不能总结。

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
busg9geu

busg9geu1#

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

然而,关于它在做什么,这还不太清楚。

kxe2p93d

kxe2p93d2#

也可以使用条件 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>

相关问题