2010-12-07 6 views
3

J'ai un tableau ci-dessousComment puis-je faire cette requête par SQL pur?

first  second 
-------  ---------- 
100  0 
200  0 
0   400 

Je veux descendre en dessous de résultat

first  second  result 
-------  ---------- ---------- 
100  0   100 
200  0   300 
0   400   -100 

Comme vous pouvez voir que le paramètre de résultat est la somme des précédente (première somme) Comment puis-je écrire une telle requête ?

MYSQL solution est très simple, mais des solutions simples recherchent Microsoft Sql Server.

set @result =0; 
select first, second, @result := @result + first - second as result 
from tablo; 

résultats

first second result 
100 0  100 
200 0  300 
0  400  -100 

Répondre

3

Voici une version avec une expression de table commune. Il souffre également du problème du manque de commande, alors j'ai utilisé le second, le premier pour obtenir les résultats souhaités.

WITH cte as 
    (
    select [first], [second], [first] - [second] as result, 
     ROW_NUMBER() OVER (ORDER BY second, first) AS sequence 
    from tableo 
    ) 

SELECT t.[first], t.[second], SUM(t2.result) AS result 
from cte t 
JOIN cte t2 on t.sequence >= t2.sequence 
GROUP BY t.[first], t.[second] 
+0

sélectionnez * dans #gec à partir de tab; alter table #gec ajouter le résultat float; déclare @result float; set @result = 0; mettre à jour #gec set @ result = resultat = @ resultat + premiere seconde; sélectionnez * depuis #gec; –

4

Votre premier problème est que vous en supposant un ordre où il n'y en a pas. Une requête sans clause order by n'a aucun ordre garanti. Les tables sans index cluster ne possèdent pas d'ordre défini.

Donc, si nous fixons cela et mettre une colonne identity sur la table afin que nous avons un ordre bien défini, vous pouvez utiliser un CTE récursive faire (en MSSQL 2005 et plus récent):

with running_sum as (
    select 
    t.id, t.first, t.second, t.first-t.second as result 
    from 
    table t where t.id = 1 
    UNION ALL 
    select 
    t.id, t.first, t.second, r.result+t.first-t.second 
    from 
    table t 
    join running_sum r on r.id = t.id - 1 
) 
select 
    * 
from 
    running_sum 
order by 
    id 
+0

Merci, c'était bon –