2017-09-09 46 views
0

請幫助我構建查詢。如何在某些情況下獲得MAX值(SQL)

需要得到MAX(LVALUE)& SUM(BVALUE)。 這是非常簡單的要求,但有三個條件我應該考慮如下。

a。如果BVALUE爲零,則該行不應涉及構建MAX(LVALUE)。

b。每個NAME至少應打印一行。

c。如果所有BVALUE都爲零,MAX(LVALUE)應該爲零。

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; 

下面簡單的查詢工作,但MAX(左值)929292從bValue的1零值驅動,使得它超出了規則的。

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 

回答

1

使用帶有FILTER clausecoalesce()聚合函數來獲得零爲NULL結果:

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) 

你可以用它代替FILTER CASE表達式如果最後沒有在RDBMS中稱爲:

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; 
+0

美麗。這就是我想試試的。CASE WHEN。非常感謝! – Sigularity

1

既然你不是在計算最大時考慮BVALUE = 0,則可以排除所有行時BVALUE = 0在所有情況下,也不會有助於SUM(BVALUE),因爲它是0

select max(lvalue), sum(bvalue) 
from p_test 
where bvalue != 0 
group by name 

既然你需要表現出創紀錄的每一個名字,上面會不顯示記錄「第二」。爲了解決這個問題,你可以加入到自己,或者使用子查詢

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 
+0

你明白我想要的完全。它運作良好。非常感謝。 – Sigularity