2016-06-01 12 views
0

Ich habe ein folgendes Szenario vor:Wie ignoriere ich Nullen, wenn Ausdrücke analytische Funktionen verwenden?

SELECT 
NAME, 
CASE WHEN ECHUE LIKE 'echue' 
    THEN sum(RESTE) over (partition by NAME ,ECHUE) 
END 
    as TOT_RESTE_ECHUE, 
sum(RESTE) over (partition by NAME) as TOT_RESTE_CLIENT, 
FROM TABLE 

Was ich in der Tabelle haben:

Das ist mein SQL ist

Name  | ECHUE  |RESTE 
-----------|-----------|--------- 
John  | ECHUE  | 20 
John  | ECHUE  | 20 
John  | null  | 20 
John  | ECHUE  | 20 

Was ich bekommen:

Name  | ECHUE  |RESTE |TOT_RESTE_ECHUE | TOT_RESTE_CLIENT 
-----------|-----------|---------|----------------|------------------ 
John  | ECHUE  | 20  |60    |80 
John  | ECHUE  | 20  |60    |80 
John  | null  | 20  |null   |80 
John  | ECHUE  | 20  |60    |80 

Was i wollen:

Name  | ECHUE  |RESTE |TOT_RESTE_ECHUE | TOT_RESTE_CLIENT 
-----------|-----------|---------|----------------|------------------- 
John  | ECHUE  | 20  |60    |80 
John  | ECHUE  | 20  |60    |80 
John  | null  | 20  |60    |80 
John  | ECHUE  | 20  |60    |80 

Ich benutze ORACLE Datenbank Version 12. Ich kann nicht Where ECHUE IS NOT NULL verwenden, da ich TOT_RESTE_CLIENT korrekt gezählt werden muss.

+0

wahrscheinlich ist Ihre einfachste Wette, nur hinzuzufügen, wo echue ist nicht null zu Ihrer Anfrage. Sind in der Spalte ECHUE andere Werte möglich als ECHUE und null? – Boneist

+0

Nein, weder ECHUE noch NULL. Ich werde nicht verwenden, wo echue nicht null ist, weil ich dasselbe tun muss, um in der ECHUE-Spalte auf Null zu setzen. –

Antwort

2

Oracle-Setup:

CREATE TABLE table_name (name, echue, reste) AS 
SELECT 'John', 'ECHUE', 20 FROM DUAL UNION ALL 
SELECT 'John', 'ECHUE', 20 FROM DUAL UNION ALL 
SELECT 'John', NULL, 20 FROM DUAL UNION ALL 
SELECT 'John', 'ECHUE', 20 FROM DUAL; 

Abfrage:

SELECT t.* 
     SUM(CASE WHEN echue IS NOT NULL THEN reste END) 
     OVER (PARTITION BY name) AS tot_reste_echue 
FROM table_name t; 

Ausgang:

NAME ECHUE RESTE TOT_RESTE_ECHUE 
---- ----- ----- --------------- 
John ECHUE 20    60 
John ECHUE 20    60 
John   20    60 
John ECHUE 20    60 

Wenn Sie müssen auch PARTITION BY der ECHUE Spalte und umfassen NULL und 'ECHUE' Werte zusammen, dann könnten Sie tun:

SELECT t.* 
     SUM(CASE WHEN echue IS NOT NULL THEN reste END) 
     OVER (PARTITION BY name, COALESCE(echue, 'ECHUE')) AS tot_reste_echue 
FROM table_name t; 
0

eine Abfrage für die gewünschte Ausgabe zu erhalten ist die folgende:

SELECT 
    name, 
    echue, 
    reste, 
    (SELECT SUM(reste) FROM test t2 WHERE t2.name = t1.name) AS tot_reste_echue 
FROM test t1 
+1

Ich korrigiere die Antwort accordling, hoffe, was du brauchst :-) – Carlo

0

Hier ist ein Weg, um die Ergebnisse mit der null ECHUE Reihe immer noch vorhanden:

with sample_data as (select 'John' name, 'ECHUE' echue, 20 reste from dual union all 
        select 'John' name, null echue, 20 reste from dual union all 
        select 'John' name, 'ECHUE' echue, 20 reste from dual union all 
        select 'John' name, 'ECHUE' echue, 20 reste from dual) 
-- end of mimicking a table called sample_data with your data in it. See SQL below: 
select name, 
     echue, 
     reste, 
     case when echue = 'ECHUE' or echue is null then 
       sum(case when echue is null then 0 else reste end) over (partition by name) 
     end tot_reste_echue 
from sample_data; 

NAME ECHUE  RESTE TOT_RESTE_ECHUE 
---- ----- ---------- --------------- 
John ECHUE   20    60 
John ECHUE   20    60 
John ECHUE   20    60 
John    20    60