Oracle 如何在某些条件下获得最大值(SQL)

Oracle 如何在某些条件下获得最大值(SQL),oracle,postgresql,Oracle,Postgresql,请帮我建立一个查询 需要获取MAXLVALUE和SUMBVALUE。 这是非常简单的要求,但有3个条件我应该考虑如下: a。如果BVALUE为零,则该行不应参与构建MAXLVALUE b。每个名称至少应打印一行 c。如果所有BVALUE都为零,则MAXLVALUE应为零 CREATE TABLE P_TEST ( NAME VARCHAR2(10), LVALUE NUMBER, BVALUE NUMBER ) / INSERT INTO P_TEST VALUES('FIRST',92929

请帮我建立一个查询

需要获取MAXLVALUE和SUMBVALUE。 这是非常简单的要求,但有3个条件我应该考虑如下:

a。如果BVALUE为零,则该行不应参与构建MAXLVALUE

b。每个名称至少应打印一行

c。如果所有BVALUE都为零,则MAXLVALUE应为零

CREATE TABLE P_TEST
(
NAME VARCHAR2(10),
LVALUE NUMBER,
BVALUE NUMBER
)
/

INSERT INTO P_TEST VALUES('FIRST',929292,0);
INSERT INTO P_TEST VALUES('FIRST',12,32);
INSERT INTO P_TEST VALUES('FIRST',-34,0);
INSERT INTO P_TEST VALUES('FIRST',21,0);
INSERT INTO P_TEST VALUES('SECOND',79292,0);
COMMIT;
下面的查询只是工作,但MAXLVALUE 929292是由BVALUE的零值驱动的,因此它不符合规则

SELECT NAME,MAX(LVALUE),SUM(BVALUE)
FROM P_TEST
GROUP BY NAME
/
@错误结果

NAME       MAX(LVALUE) SUM(BVALUE)
---------- ----------- -----------
SECOND       79292       0
FIRST       929292      32
@期望结果

NAME       MAX(LVALUE) SUM(BVALUE)
---------- ----------- -----------
SECOND       0       0
FIRST       12      32

将聚合函数与和一起使用,以获取空结果的零:

select 
    name,
    coalesce(max(lvalue) filter (where bvalue <> 0), 0) as max_lvalue,
    coalesce(sum(bvalue) filter (where bvalue <> 0), 0) as sum_bvalue
from p_test
group by name;

  name  | max_lvalue | sum_bvalue 
--------+------------+------------
 SECOND |          0 |          0
 FIRST  |         12 |         32
(2 rows)
如果RDBMS中不知道最后一个表达式,则可以使用CASE表达式而不是FILTER:

select 
    name,
    coalesce(max(case when bvalue <> 0 then lvalue end), 0) as max_lvalue,
    coalesce(sum(case when bvalue <> 0 then bvalue end), 0) as sum_bvalue
from p_test
group by name;

将聚合函数与和一起使用,以获取空结果的零:

select 
    name,
    coalesce(max(lvalue) filter (where bvalue <> 0), 0) as max_lvalue,
    coalesce(sum(bvalue) filter (where bvalue <> 0), 0) as sum_bvalue
from p_test
group by name;

  name  | max_lvalue | sum_bvalue 
--------+------------+------------
 SECOND |          0 |          0
 FIRST  |         12 |         32
(2 rows)
如果RDBMS中不知道最后一个表达式,则可以使用CASE表达式而不是FILTER:

select 
    name,
    coalesce(max(case when bvalue <> 0 then lvalue end), 0) as max_lvalue,
    coalesce(sum(case when bvalue <> 0 then bvalue end), 0) as sum_bvalue
from p_test
group by name;

由于在计算BVALUE=0时不考虑最大值,因此可以在BVALUE=0时排除所有行。在所有情况下,它都不会对SUMBVALUE作出贡献,因为它是0

select max(lvalue), sum(bvalue)
from p_test
where bvalue != 0
group by name
因为您需要为每个名称显示一条记录,所以上面不会显示第二个名称的记录。要解决这个问题,您可以加入到self,或者使用子查询

select nvl(max(b.lvalue), 0), nvl(sum(b.bvalue), 0)
from p_test a, p_test b
where a.name = b.name (+)
and b.bvalue != 0
或者,以下内容允许您对每个摘要包含的内容进行更多控制

select distinct name, 
     nvl((select max(b.lvalue) from p_test b where b.name = a.name and b.bvalue != 0), 0),
     nvl((select sum(c.lvalue) from p_test c where c.name = a.name), 0)
from p_test a

由于在计算BVALUE=0时不考虑最大值,因此可以在BVALUE=0时排除所有行。在所有情况下,它都不会对SUMBVALUE作出贡献,因为它是0

select max(lvalue), sum(bvalue)
from p_test
where bvalue != 0
group by name
因为您需要为每个名称显示一条记录,所以上面不会显示第二个名称的记录。要解决这个问题,您可以加入到self,或者使用子查询

select nvl(max(b.lvalue), 0), nvl(sum(b.bvalue), 0)
from p_test a, p_test b
where a.name = b.name (+)
and b.bvalue != 0
或者,以下内容允许您对每个摘要包含的内容进行更多控制

select distinct name, 
     nvl((select max(b.lvalue) from p_test b where b.name = a.name and b.bvalue != 0), 0),
     nvl((select sum(c.lvalue) from p_test c where c.name = a.name), 0)
from p_test a

你完全明白我想要什么。它工作得很好。非常感谢。你完全明白我想要什么。它工作得很好。非常感谢你,真漂亮。这就是我想尝试的。。情况是什么时候。谢谢!美丽的这就是我想尝试的。。情况是什么时候。谢谢!