Comment créer une colonne de sum sans une sous-requête interne?

J'utilise SQL Server 2008 R2

J'ai une requête complexe dont j'ai besoin pour avoir une colonne sommairement conditionnée pour cela.

Voici une version simplifiée de ma requête et de mes résultats:

DECLARE @t TABLE (id int, condition int, value int); INSERT INTO @t VALUES (1,1,12), (2,0,88), (3,1,11) SELECT *, (SELECT SUM(value) FROM @t WHERE condition = 1) as SumOfConditionalValues FROM @t 

Voici les résultats de cette requête "

 id condition value SumOfConditionalValues 1 1 12 23 2 0 88 23 3 1 11 23 

Je ne peux pas me permettre la sous-requête SumOfConditionalValues .

Existe-t-il une manière élégante d'accomplir la colonne sommairement conditionnée sans elle?

Quelles commands d'agrégat conviennent ici, le cas échéant, et comment les appliquer?

Essaye ça:

 SELECT *, SUM(CASE WHEN condition = 1 THEN value END) OVER() SumOfConditionalValues FROM @t 

Voir ici: http://sqlfiddle.com/#!3/1abea/1

Utilisez une auto-jointure:

 CREATE TABLE MyTable (id int, condition int, value int); INSERT INTO MyTable VALUES (1,1,12), (2,0,88), (3,1,11) SELECT MyTable.id, MyTable.Condition, MyTable.value, SUM(JoinedMyTable.Value) FROM MyTable LEFT JOIN MyTable JoinedMyTable ON MyTable.condition = JoinedMyTable.Condition GROUP BY MyTable.id, MyTable.Condition, MyTable.value 

EDIT: Ne sait pas si vous voulez que chaque ligne affiche la sum des lignes où condition = 1, mais si vous changez simplement la clause de jointure pour être:

 LEFT JOIN MyTable JoinedMyTable ON JoinedMyTable.Condition = 1 

Je crois que ce que vous cherchez est la déclaration "CASE" … Très puissant, par exemple:

  select id, sum(case when condition=1 then value else 0 end) group by id..etc 
 Declare @sum int SELECT @sum=SUM(value) FROM @t WHERE condition = 1 select *,@sum from yourtable 

Vous pouvez amener les résultats agrégés par condition:

 DECLARE @t TABLE (id int, condition int, value int); INSERT INTO @t VALUES (1,1,12), (2,0,88), (3,1,11) SELECT *, sum(value) over (partition by condition) as SumOfConditionalValues FROM @t 

Je pense que c'est ce que tu veux:

 SELECT id, condition, value, SUM(CASE WHEN condition = 1 THEN value_at_1 END) OVER() SumOfConditionalValues FROM (select *, (case when condition = 1 then value end) as value_at_1 from @t ) t 

Vous avez besoin d'une "valeur conditionnelle" que vous pouvez créer dans une sous-requête.