2016-04-19 7 views
-1

enter image description here
so sollte es aussehen.oracle sum over() mit where-Klausel

eine weitere spezielle Frage. Ich habe folgende Daten und Abfrage:

with helptab as ( 
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all 
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual  
union all  
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all  
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '6762' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6763' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6835' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6835' as nr, 'B' as sub_val, 1 as sub_nr from dual 
union all 
select '6835' as nr, 'B' as sub_val, 1 as sub_nr from dual 
union all 
select '6835' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '6835' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'C' as sub_val, 1 as sub_nr from dual 
union all 
select '8904' as nr, 'C' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'C' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'C' as sub_val, 1 as sub_nr from dual 
union all 
select '8904' as nr, 'C' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8904' as nr, 'D' as sub_val, 0 as sub_nr from dual 
union all 
select '8905' as nr, 'B' as sub_val, 1 as sub_nr from dual 
union all 
select '8905' as nr, 'B' as sub_val, 0 as sub_nr from dual 
union all 
select '8905' as nr, 'C' as sub_val, 0 as sub_nr from dual  
union all 
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8905' as nr, 'A' as sub_val, 0 as sub_nr from dual 
union all 
select '8905' as nr, 'D' as sub_val, 0 as sub_nr from dual) 
select nr, sub_val, sub_nr, count(sub_val) as cnt 
, case when sub_val = 'A' then 0 when sum(count(sub_val)) over(partition by nr) >= 5 then count(sub_val) else 0 end as MoreThan5 
, case when sub_val = 'A' then count(sub_val) when sum(count(sub_val)) over(partition by nr) < 5 then count(sub_val) else 0 end as LessThan5 
from helptab 
group by nr, sub_val, sub_nr 
order by nr, sub_val, sub_nr 

, wie es funktionieren soll:
jede Zeile, wo sub_val ‚A‘ gleich muss auf der LessThan5 Spalte hat zur Folge hat. Alle anderen müssen durch Summe über nr und Sub_val (außer 'A') überprüft werden. wenn weniger als 5, müssen alle Ergebnisse auch auf die LessThan5-Spalte gesetzt werden, andernfalls auf MoreThan5. Ich dachte sum() over (Partition by) ist der richtige Weg, aber es funktioniert nicht richtig.

+4

Zwei einfache Tabellen in der Frage - mit Beispieldaten und die gewünschten Ergebnissen - wirklich helfen würde, andere zu verstehen, was Sie tun wollen. –

+0

Ich habe gerade ein Bild hinzugefügt, um es (hoffentlich) klarer zu machen – user

+0

Bitte lesen Sie die Richtlinien für das Posten von Fragen. http://stackoverflow.com/help/on-topic "Fragen, die Debugging-Hilfe suchen (" Warum funktioniert dieser Code nicht? ") müssen das gewünschte Verhalten, ein bestimmtes Problem oder einen Fehler und den kürzesten Code enthalten, der für die Reproduktion benötigt wird die Frage selbst. Fragen ohne eine eindeutige Problembeschreibung sind für andere Leser nicht nützlich. Siehe: Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels. " –

Antwort

1

Wenn ich verstehe alles richtig, zwei kleine Änderungen erforderlich sind:

select nr, sub_val, sub_nr, count(sub_val) as cnt, 
     case 
     when sub_val = 'A' then 0 
     when sum(count(case when sub_val <> 'A' then sub_val end)) -- <-- here 
       over(partition by nr) >= 5 then count(sub_val) 
     else 0 
     end as MoreThan5, 
     case 
     when sub_val = 'A' then count(sub_val) 
     when sum(count(case when sub_val <> 'A' then sub_val end)) -- <-- and here 
       over(partition by nr) < 5 then count(sub_val) 
     else 0 
     end as LessThan5 
    from helptab 
group by nr, sub_val, sub_nr 
order by nr, sub_val, sub_nr 
+0

perfekt! das ist genau das, was ich brauche. Danke vielmals. – user

+0

Gern geschehen. Ich denke, Sie können 'sum (count (...))' in einfache 'count (...)' ändern, aber bitte überprüfen Sie es. –

+0

Ich bin überrascht, dass diese Abfrage etwas Nützliches tut. Die Verwendung einer 'group by'-Spalte als Bedingung für bedingte Aggregation scheint ungewöhnlich. –