2010-09-24 17 views

Répondre

11

essayer cette façon:

select value, 
(select sum(t2.value) from table t2 where t2.id <= t1.id) as accumulated 
from table t1 

mais si elle ne fonctionne pas sur la base de données, ajouter ordre juste par quelque chose

select value, 
(select sum(t2.value) from table t2 where t2.id <= t1.id order by id) as accumulated 
from table t1 
order by id 

cela fonctionne sur un oracle;) mais il se doit sur un sqlite aussi

+0

Si cela avait fonctionné sur une table sans identifiant pour commander (ou commander après un autre critère, sans possibilité de strict moala

+0

Vous pouvez faire cela avec une requête analytique Lorsque vous utilisez Oracle, aucune auto-joint n'est nécessaire, voir http://www.orafaq.com/node/55. Malheureusement sqlte ne supporte pas les requêtes analytiques. – TTT

1

L'opération est appelée somme cumulée. SQLite ne le supporte pas tel quel, mais il existe des moyens de le faire fonctionner. On est juste comme Sebastian Brózda posté. Un autre j'ai détaillé here dans une autre question.

+0

ou "total cumulé". THX. – moala

1

Voici une méthode pour créer un total cumulé sans l'inefficacité de la somme de toutes les lignes précédentes. (Je sais que cette question est de 6 ans, mais il est l'une des premières entrées de Google pour un total de fonctionnement SQLite.)

create table t1 (value integer, accumulated integer, id integer primary key); 
insert into t1 (value) values (1); 
insert into t1 (value) values (3); 
insert into t1 (value) values (13); 
insert into t1 (value) values (1); 
insert into t1 (value) values (5); 

UPDATE 
    t1 
SET 
    accumulated = ifnull(
    (
     SELECT 
      ifnull(accumulated,0) 
     FROM 
      t1 ROWPRIOR 
     WHERE 
      ROWPRIOR.id = (t1.id -1)),0) + value; 


.headers on 
select * from t1; 
value|accumulated|id 
1|1|1 
3|4|2 
13|17|3 
1|18|4 
5|23|5 

Cela ne doit être exécuté une fois après l'importation de toutes les valeurs. Ou, définissez la colonne accumulée sur toutes les valeurs null avant de l'exécuter à nouveau.

+0

Cela fonctionne très bien. J'ai pris une grande table qui résistait à d'autres modèles d'accumulation et sélectionné (avec ordre par) les champs pertinents dans une table temporaire avec un autoincrement, puis utilisé ce modèle en ajoutant un 't1.itemId = ROWPRIOR.itemId' à l'endroit où clause. Chaque fois qu'il touche un nouvel objet, l'accumulation recommence. Couper un temps d'exécution de plusieurs heures à peut-être 15s. – chad