J'ai une table postgresql contenant les mouvements de différents éléments (modèles) entre les entrepôts.Calculer les différences entre les lignes lors du regroupement avec SQL
Par exemple, l'enregistrement suivant signifie que 5 unités de modèle 1 ont été envoyés sous forme entrepôt 1 à 2:
source target model units
------ ------ ----- -----
1 2 1 5
Je suis en train de construire une requête SQL pour obtenir la différence entre les unités envoyées et reçues , regroupés par modèles. Encore une fois avec un exemple:
source target model units
------ ------ ----- -----
1 2 1 5 -- 5 sent from 1 to 2
1 2 2 1
2 1 1 2 -- 2 sent from 2 to 1
2 1 1 1 -- 1 more sent from 2 to 1
Le résultat devrait être:
source target model diff
------ ------ ----- ----
1 2 1 2 -- 5 sent minus 3 received
1 2 2 1
Je me demande si cela est possible avec une seule requête SQL.
Voici le script de création de la table et des données, tout le monde juste au cas où veut l'essayer:
CREATE TEMP TABLE movements
(
source INTEGER,
target INTEGER,
model INTEGER,
units INTEGER
);
insert into movements values (1,2,1,5);
insert into movements values (1,2,2,1);
insert into movements values (2,1,1,2);
insert into movements values (2,1,1,1);
Bonne réponse! très clair! – msemelman
Merci, laissez-moi essayer. Comment votre requête se compare-t-elle à la requête fournie par @Martin Smith, qui évite l'utilisation de "UNION ALL" (utilise des clauses CASE à la place)? –
@Guido: Sa réponse scanne la table une seule fois, le mien la scanne deux fois. Combien de rangs avez-vous? La performance est-elle un problème? Je dirais que ma suggestion est plus claire/lisible, mais c'est ma propre opinion et est subjective. –