2016-08-19 2 views
0

Ich habe herumgestöbert und eine Reihe von verschiedenen Beispielen gefunden, von denen keines zu funktionieren schien. Der nächste, den ich habe, war über(), aber es wegen Syntaxfehler fehlgeschlagen.Berechnen Sie die Verhältnisse der Subsummen in der Gesamtsumme

Betrachten Sie die folgende Abfrage.

select Id, 
    count(*) as Count, 
    sum(Amount) as Sum 
from MyTable 
group by Id 

Das Ergebnis ist eine Liste von Id s mit der Anzahl der Vorkommen und die Werte betrugen. Das funktioniert großartig. Ich möchte jedoch auch zeigen, wie groß der Anteil jeder Summe in der Gesamtsumme ist. Ich habe Folgendes versucht.

select Id, 
    count(*) as Count, 
    sum(Amount) as Sum, 
    sum(Amount)/sum(Amount) over() as Ratio 
from MyTable 
group by Id 

Es schlägt fehl, und ich bin nicht sicher, wie es zu beheben (vor allem, weil das über Dingen eher eine Vermutung als stabil Wissen war).

Antwort

2

Sie müssen den Gesamtbetrag für alle Datensätze abzurufen, die Sie mit der folgenden Aktionen durchführen:

SELECT sum(Amount) FROM MyTable

und setzen, dass als Divisor zum sum(Amount) in Ihrer Anfrage. So Ihre Anfrage wird wie folgt aussehen:

select Id, 
     count(*) as Count, 
     sum(Amount) as Sum, 
     sum(Amount)/(SELECT sum(Amount) FROM MyTable) as Ratio 
from  MyTable 
group by Id 

Wenn Ihr Amount Datentyp INT ist, müssen Sie das Verhältnis als decimal Datentyp werfen. Zum Beispiel:

select Id, 
     count(*) as Count, 
     sum(Amount) as Sum, 
     CAST (sum(Amount) AS NUMERIC(10,2))/(SELECT sum(Amount) FROM MyTable) as Ratio 
from  MyTable 
group by Id 

[EDIT]: Wenn Sie OVER Klausel verwenden möchten, würde ich Ihnen vorschlagen, eine weitere Unterabfrage haben:

SELECT [Id], [Count], [Sum], [SUM]/SUM([SUM]) OVER (PARTITION BY 1) 
FROM 
(
     select Id, 
        count(*) as Count, 
        sum(Amount) as Sum    
     from  MyTable 
     group by Id 
) as t 
+0

Guter Vorschlag. In meinem speziellen Fall wäre die Unterabfrage jedoch humong (Joins, Wheres, Sub-Sub-Selects usw.). Ich hatte auf eine faule Mannlösung gehofft, hehe. Kann das mit diesem * over * dingy gemacht werden? –

Verwandte Themen