2017-11-24 3 views
0

Dieses Problem tritt in vielen praktischen Situationen auf, in denen fehlende Werte durch erwartete Werte ersetzt werden, die aus den verbleibenden verfügbaren Werten bestimmt werden. Ich versuche, Durchschnitt von Spalte A über n Spalte zu berechnen, sagen Sie C1, ..., Cn, die Nullwerte haben können. Wenn eine der Spalten null ist, möchte ich den berechneten Durchschnitt über den Werten in den anderen Spalten ersetzen und die Null-Spalte ausschließen. Wenn zum Beispiel nur drei Spalten (c1, C2 und C3) vorhanden sind, möchte ich, wo immer alle drei Spalten einen Wert haben, den Durchschnitt für die Untergruppen in diesen drei Spalten angeben. Wenn eine Spalte, z. B. die dritte Spalte, fehlt, wird der Durchschnittswert über die Werte der anderen beiden Spalten berechnet. Wenn auch eine zweite Spalte fehlt, wird der Durchschnittswert nur über die Werte einer Spalte berechnet.Progessive Group By Command

So eine Antwort ist einfach zu melden:

Select Avg(A) as AvgA 
From Table 
Group by C1, C2, and C3 

für die Situation, in der C3 null ist und C1 und C2 die Werte v1 und v2, dann sollte die AVGA berechnet werden:

Select Avg(A) as AvgA 
From Table 
Where C1=v1 and C2=v2 
Group by C1, C2 

Kann mir jemand einen Code geben, der dies automatisch für alle n Spalten tut? Die allgemeine n-Spalten-Lösung müsste in der Lage sein, n-1-Gruppen von-Spalten zu verwenden und eine Spalte zu löschen, die null ist. Die n-1-Gruppe-B muss bei v1 bis vn-1-Werten ausgewertet werden.

+1

Einige Beispieldaten und Ihre erwarteten Ergebnisse woot helfen Ihnen einen langen Weg gehen. –

Antwort

0

Wenn eine der drei Spalten null ist, werden automatisch die anderen 2 für die Gruppierung verwendet. Wenn 2 der 3 Null sind, wird die dritte zur Gruppierung verwendet. Wenn alle 3 null sind, erhalten Sie eine Zeile im Ergebnis, in der alle 3 als Gruppierung null sind.

. Von dem, was ich von Ihrer Frage verstehe, müssen Sie nur nach den Spalten gruppieren.

Wenn ein einfacher Ansatz nicht ausreichend ist, dann könnte man so etwas wie dies versucht:

Select 
     coalesce(c1,c2,c3) c123 
    , coalesce(c2,c3) c23 
    , c3 
    , Avg(A) as AvgA 
Avg(A) as AvgA From Table 
Group by 
     coalesce(c1,c2,c3) 
    , coalesce(c2,c3) 
    , c3