在Oracle SQL中,只对特定条件下的字段进行求和。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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

谢谢,注意安全

答案

在这种情况下,你想 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>

以上是关于在Oracle SQL中,只对特定条件下的字段进行求和。的主要内容,如果未能解决你的问题,请参考以下文章

oracle语句,我想查询A表中的a字段下的值不等于B表中b的值的数据,

如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组

oracle和mysql中分组取特定的某一行的数据

批量修改oracle数据库中的某一个字段?

如何根据 Oracle 表格 6i 中的某些条件在两个 LOV 之间进行选择

oracle 如何查找特定字母开头的某个字段?