2017-12-04 2 views
0

Ich habe eine Tabelle, die wie folgt aussieht:STABWN für berechnete Felder

ID  CHANNEL VENDOR num_PERIOD SALES.A SALES.B 
000001 Business Shop 1   40  30 
000001 Business Shop 2   60  20 
000001 Business Shop 3   NULL  30 

Mit vielen Kombinationen von ID, KANAL und Kreditoren und Verkaufsrekorden für jede von ihnen im Laufe der Zeit (num_PERIOD).

Ich möchte die durchschnittliche Standardabweichung eines neuen Feldes erhalten, die die Summe von SALES.A + SALES.B sum(IS.NULL(SALES.A,0) + ISNULL(SALES.B,0)) zurückgibt.

Das Problem, das ich habe, ist, dass STDEVP mit berechneten Feldern fehlschlägt, und das Ergebnis, das zurückgibt, ist ungültig.

Ich habe mit dem Versuch: Allerdings

select ID, CHANNEL, VENDOR, stdevp(sum(isnull(SALES.A,0) + ISNULL(QSALES.B,0))) OVER (PARTITION BY ID, CHANNEL, VENDOR) as STDEV_SALES 
     FROM TABLE 
GROUP BY ID, CHANNEL, VENDOR 

, die Ergebnisse, die ich obtaning sind immer 0 oder NULL.

Was ich erhalten möchte, ist die durchschnittliche Standardabweichung von jeder ID, CHANNEL und VENDOR im Laufe der Zeit (num_PERIOD).

Kann jemand bitte eine Annäherung dafür finden?

Antwort

0

Ihre Abfrage stimmt nicht mit den Beispieldaten überein.

Ich kann das Problem jedoch sehen. Die SUM() berechnen einen einzelnen Wert für jede Gruppe, und Sie nehmen dann die Standardabweichung dieses Werts. Da Sie Aggregationsfunktionen nicht verschachteln können, haben Sie sie in eine Fensterfunktion umgewandelt.

Entfernen Sie die sum(). Folgendes sollte in SQL Server arbeiten:

SELECT ID, CHANNEL, VENDOR, 
     STDEVP(COALESCE(SALES.A, 0) + COALESCE(QSALES.B, 0)) as STDEV_SALES 
FROM SALES . . . 
    QSALES 
GROUP BY ID, CHANNEL, VENDOR; 

Ich würde auch die COUNT(*) zurückzukehren. . . Die Standardabweichung macht keinen Sinn, wenn Sie weniger als 3 Zeilen haben. (Okay, es ist für zwei Werte definiert, aber nicht sehr nützlich.)

Verwandte Themen