仅在 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>
我正在尝试从 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>