2010-10-05 19 views
1

Je souhaite obtenir une somme à partir d'une colonne, avec et sans condition. Le code que j'ai maintenant estOptimisation des agrégats avec et sans condition en ms sql

SELECT regular.id, regular.sum as regularsum, special.sum as specialsum FROM 
(SELECT Sum(stuff) as sum, id FROM table 
WHERE commonCondition = true 
GROUP BY id) as regular 
INNER JOIN 
(SELECT Sum(stuff) as sum, id FROM table 
Where commonCondition = true AND specialCondition = true 
GROUP BY id) as special 
ON regular.id = special.id 

Qui fonctionne, mais semble très inefficace, pour ne pas dire moche. la table est assez grande, donc une optimisation serait la bienvenue. Comment puis-je écrire cela de façon plus efficace et plus efficace?

+0

Avez-vous des index sur la table? – Thakur

+0

Il y a un index sur id et sur specialCondition – Martijn

Répondre

2

Je pense que vous pourriez faire quelque chose comme ceci:

SELECT 
    Sum(stuff) as regularsum, 
    sum(case when specialcondition=true then stuff else 0 end) as specialsum, 
    id FROM table 
WHERE commonCondition = true 
GROUP BY id 

Cependant, vous voulez tester pour voir si elle était plus vite.

+0

Le temps d'exécution est passé de 98783 millies à 58631 millies, sans compter qu'il s'agit d'un code beaucoup plus propre. Merci! – Martijn

+0

Juste pour les enregistrements, bien que cette déclaration soit ce que je voulais dire, les deux déclarations ne sont pas identiques: cette instruction inclut les lignes où specialcondition = false pour tous les cas, et l'instruction d'origine ne le fait pas. Une jointure extérieure gauche avec un isnull (specialSum, 0) dans l'original les rendrait identiques – Martijn