2016-08-19 6 views
0

J'ai fait le tour et trouvé un certain nombre d'exemples différents, dont aucun ne semblait fonctionner. Le plus proche est over() mais il a échoué en raison d'une erreur de syntaxe.Calculer les ratios de sous-sommes dans la somme totale

Envisagez la requête suivante.

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

Le résultat est une liste de Id s avec le nombre d'occurrences et les valeurs sont élevées. Cela fonctionne très bien. Cependant, j'aimerais aussi montrer à quel point chaque somme est importante dans le total général. J'ai essayé ce qui suit.

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

Il échoue et je ne suis pas sûr de savoir comment y remédier (surtout parce que le sur thingy était plus d'une estimation que la connaissance stable).

Répondre

2

Vous devez récupérer le montant total pour tous les enregistrements que vous pouvez faire avec les éléments suivants:

SELECT sum(Amount) FROM MyTable

et mettez comme diviseur à l'sum(Amount) dans votre requête. Ainsi, votre requête ressemblera ci-dessous:

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

Si votre Amount type de données est INT, vous devrez peut jeter le ratio comme un type de données decimal. Par exemple:

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]: Si vous souhaitez utiliser la clause OVER, je vous suggère d'avoir un plus sous_requête:

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

Bonne suggestion. Cependant, dans mon cas particulier, la sous-requête serait trop lourde (jointures, wheres, sous-sous-sélections, etc.). J'espérais une solution paresseuse, hehe. Peut-il être fait en utilisant ce * sur * thingy? –