Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/04/2011, 11h53   #1
Membre du Club
 
Inscription : mars 2002
Messages : 233
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 233
Points : 65
Points : 65
Par défaut additionner des champs enregistrement par enregistrement

bonjour,

je travaille sous FireBird 2.5
j'ai 3 requetes de sélection qui me renvoient chacune 16 enregistrements de plusieurs champs.
je voudrais faire la somme du champ1 des 3 requetes, enregistrement par enregistrement c'est à dire

valeur1 de champ1 de requete1 + valeur1 de champ1 de requete2 + valeur1 de champ1 de requete3

puis ensuite

valeur2 de champ1 de requete1 + valeur2 de champ1 de requete2 + valeur2 de champ1 de requete3

etc ...
au final j'obtiens encore 16 enregistrements

comment faire ? (quitte à faire une procedure stockée si nécessaire)
jakouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h00   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Je ne comprends pas bien ta question ?

Peux-tu nous montrer :
  • ta requête
  • ce que tu obtiens comme résultat
  • ce que tu voudrais obtenir
Enfin, en SQL, on ne parle pas de champs et d'enregistrements mais de colonnes et de lignes
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h17   #3
Membre du Club
 
Inscription : mars 2002
Messages : 233
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 233
Points : 65
Points : 65
voici la 1ere requete (les 2 autres sont similaires)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 
 
SELECT cast(B.PRG_CODMRIN AS INTEGER) PRG_CODMRIN,
       MAX(B2.PRB_SEQUENCE) TRI_SEQUENCE,
       MAX(G.GPB_CODPRINCIPAL) TRI_PRINC,
       MAX(B2.GPB_COD) TRI_COD,
       MAX(B2.PRB_PGI) TRI_PGI,
       MAX(B2.PRB_CODWRIN) TRI_WRIN,
       B.PRG_CODMRIN || ' ' COD,
       min(' ' || G.PRG_LIB) LIB,
       min(UNI_COD) UNI_COD,
       sum(I.INV_QTETOTUNITE) STOCK_INIT,
       sum(K.NST_STOCKOUV) NST_STOCKOUV,
       sum(J.INV_QTETOTUNITE) STOCK_FINAL,
       cast(NULL AS NUMERIC (11, 3)) QTE_LIV,
       cast(NULL AS NUMERIC (11, 3)) QTE_TRAN,
       cast(NULL AS NUMERIC (11, 3)) QTE_PERTES,
       cast(NULL AS NUMERIC (11, 3)) STOCK_THEO,
       cast(NULL AS VARCHAR (20)) CALC_FINAL,
       cast(NULL AS NUMERIC (11, 3)) ECART_UU,
       cast(NULL AS NUMERIC (11, 3)) ECART_PRIX,
       cast(NULL AS NUMERIC (11, 3)) PCT_UU,
       cast(NULL AS NUMERIC (11, 3)) PCT_PRIX,
       cast(sum(I.INV_QTETOTUNITE * J.INV_PRIXUNITE) AS NUMERIC (11, 3))
        PRIX_STOCK_INIT,
       cast(sum(K.NST_STOCKOUV * J.INV_PRIXUNITE) AS NUMERIC (11, 3))
        PRIX_NST_STOCKOUV,
       cast(sum(J.INV_QTETOTUNITE * J.INV_PRIXUNITE) AS NUMERIC (11, 3))
        PRIX_STOCK_FINAL,
 
       cast(floatdiv(sum((SELECT floatdiv(UTJ_QTETOTJOUR1, 1) + floatdiv(
       UTJ_QTETOTJOUR2, 1) + floatdiv(UTJ_QTETOTJOUR3, 1) + floatdiv(
       UTJ_QTETOTJOUR4, 1) + floatdiv(UTJ_QTETOTJOUR5, 1) + floatdiv(
       UTJ_QTETOTJOUR6, 1) + floatdiv(UTJ_QTETOTJOUR7, 1) + floatdiv(
       UTJ_QTETOTJOUR8, 1) + floatdiv(UTJ_QTETOTJOUR9, 1) + floatdiv(
       UTJ_QTETOTJOUR10, 1) + floatdiv(UTJ_QTETOTJOUR11, 1) + floatdiv(
       UTJ_QTETOTJOUR12, 1) + floatdiv(UTJ_QTETOTJOUR13, 1) + floatdiv(
       UTJ_QTETOTJOUR14, 1) + floatdiv(UTJ_QTETOTJOUR15, 1) + floatdiv(
       UTJ_QTETOTJOUR16, 1) + floatdiv(UTJ_QTETOTJOUR17, 1) + floatdiv(
       UTJ_QTETOTJOUR18, 1) + floatdiv(UTJ_QTETOTJOUR19, 1) + floatdiv(
       UTJ_QTETOTJOUR20, 1) + floatdiv(UTJ_QTETOTJOUR21, 1) + floatdiv(
       UTJ_QTETOTJOUR22, 1) + floatdiv(UTJ_QTETOTJOUR23, 1) + floatdiv(
       UTJ_QTETOTJOUR24, 1) + floatdiv(UTJ_QTETOTJOUR25, 1) + floatdiv(
       UTJ_QTETOTJOUR26, 1) + floatdiv(UTJ_QTETOTJOUR27, 1) + floatdiv(
       UTJ_QTETOTJOUR28, 1) + floatdiv(UTJ_QTETOTJOUR29, 1) + floatdiv(
       UTJ_QTETOTJOUR30, 1) + floatdiv(UTJ_QTETOTJOUR31, 1) FROM
        INVUTILISATIONJOUR U WHERE UTJ_ANNEE = 2010 AND UTJ_MOIS = 12 AND
         U.PRB_CODWRIN = B.PRB_CODWRIN)), 1) AS NUMERIC (12, 3)) UTJ_QTETOT,
 
       cast(floatdiv(sum((SELECT J.INV_PRIXUNITE *(floatdiv(UTJ_QTETOTJOUR1, 1)
        + floatdiv(UTJ_QTETOTJOUR2, 1) + floatdiv(UTJ_QTETOTJOUR3, 1) + floatdiv
        (UTJ_QTETOTJOUR4, 1) + floatdiv(UTJ_QTETOTJOUR5, 1) + floatdiv(
        UTJ_QTETOTJOUR6, 1) + floatdiv(UTJ_QTETOTJOUR7, 1) + floatdiv(
        UTJ_QTETOTJOUR8, 1) + floatdiv(UTJ_QTETOTJOUR9, 1) + floatdiv(
        UTJ_QTETOTJOUR10, 1) + floatdiv(UTJ_QTETOTJOUR11, 1) + floatdiv(
        UTJ_QTETOTJOUR12, 1) + floatdiv(UTJ_QTETOTJOUR13, 1) + floatdiv(
        UTJ_QTETOTJOUR14, 1) + floatdiv(UTJ_QTETOTJOUR15, 1) + floatdiv(
        UTJ_QTETOTJOUR16, 1) + floatdiv(UTJ_QTETOTJOUR17, 1) + floatdiv(
        UTJ_QTETOTJOUR18, 1) + floatdiv(UTJ_QTETOTJOUR19, 1) + floatdiv(
        UTJ_QTETOTJOUR20, 1) + floatdiv(UTJ_QTETOTJOUR21, 1) + floatdiv(
        UTJ_QTETOTJOUR22, 1) + floatdiv(UTJ_QTETOTJOUR23, 1) + floatdiv(
        UTJ_QTETOTJOUR24, 1) + floatdiv(UTJ_QTETOTJOUR25, 1) + floatdiv(
        UTJ_QTETOTJOUR26, 1) + floatdiv(UTJ_QTETOTJOUR27, 1) + floatdiv(
        UTJ_QTETOTJOUR28, 1) + floatdiv(UTJ_QTETOTJOUR29, 1) + floatdiv(
        UTJ_QTETOTJOUR30, 1) + floatdiv(UTJ_QTETOTJOUR31, 1)) FROM
         INVUTILISATIONJOUR U WHERE UTJ_ANNEE = 2010 AND UTJ_MOIS = 12 AND
          U.PRB_CODWRIN = B.PRB_CODWRIN)), 1) AS NUMERIC (12, 3)) PRIX_QTETOT,
       cast(NULL AS NUMERIC (11, 3)) PRIX_LIV_TOT
FROM HISPRODBRUT B2,
     INVPRODGENERIQUE G,
     HISPRODBRUT B
     LEFT JOIN INVINVENTAIRE I ON (I.PRB_CODWRIN = B.PRB_CODWRIN AND
      I.CAL_DTACTIVITE = '11/30/2010')
     LEFT JOIN INVINVENTAIRE J ON (J.PRB_CODWRIN = B.PRB_CODWRIN AND
      J.CAL_DTACTIVITE = '4/14/2011')
     LEFT JOIN INVNIVEAUSTOCK K ON (K.PRB_CODWRIN = B.PRB_CODWRIN AND
      K.NST_ANNEE = 2010 AND K.NST_MOIS = 12)
WHERE B.PRB_DTEFFET <= '4/14/2011' AND
      (B.PRB_DTFINEFFET >= '4/14/2011' OR
      B.PRB_DTFINEFFET IS NULL) AND
      B.PRB_ACTIF = 'T' AND
      B.PRB_PERIODEINV <= 0 AND
      B.PRG_CODMRIN = G.PRG_COD AND
      G.PRB_CODCALCULCOUT = B2.PRB_CODWRIN AND
      G.PRG_RENDSTAT = 'T' AND
      B2.PRB_DTEFFET <= '4/14/2011' AND
      (B2.PRB_DTFINEFFET >= '4/14/2011' OR
      B2.PRB_DTFINEFFET IS NULL)
GROUP BY B.PRG_CODMRIN 
ORDER BY 2,
         3,
         4,
         5,
         6
j'obtiens 16 enregistrements. idem pour les 2 autres requetes.

je veux additionner la valeur du champ UTJ_QTETOT de l'enregistrement n°1 de la requete n°1 ci-dessus avec la valeur du champ UTJ_QTETOT de l'enregistrement n°1 de la requete n°2 et avec la valeur du champ UTJ_QTETOT de l'enregistrement n°1 de la requete n°3

puis faire de même avec les enregistrements n°2 et ainsi de suite jusqu'au dernier enregistrement (n°16)

au final j'obtiens 16 enregistrements dont j'ai additionné la colonne UTJ_QTETOT ligne à ligne des 3 requetes
jakouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h22   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
bonjour

les differentes requetes sont peut etre similaires, mais utilises-t-elles les memes tables ?


et n'y a t-il pas moyen de simplifier les requetes (juste pour nous permettre de la regarder sans se preoccuper des details non utiles pour ton probleme)

a+
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h57   #5
Membre du Club
 
Inscription : mars 2002
Messages : 233
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 233
Points : 65
Points : 65
voici la requete simplifiée
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
 
SELECT cast(B.PRG_CODMRIN AS INTEGER) PRG_CODMRIN,
       MAX(B2.PRB_SEQUENCE) TRI_SEQUENCE,
       MAX(G.GPB_CODPRINCIPAL) TRI_PRINC,
       MAX(B2.GPB_COD) TRI_COD,
       MAX(B2.PRB_PGI) TRI_PGI,
       MAX(B2.PRB_CODWRIN) TRI_WRIN,
       B.PRG_CODMRIN || ' ' COD,
       min(' ' || G.PRG_LIB) LIB,
       min(UNI_COD) UNI_COD,
       sum(I.INV_QTETOTUNITE) STOCK_INIT,
       sum(K.NST_STOCKOUV) NST_STOCKOUV,
       sum(J.INV_QTETOTUNITE) STOCK_FINAL,
 
       cast(floatdiv(sum((SELECT floatdiv(UTJ_QTETOTJOUR1, 1) + floatdiv(
       UTJ_QTETOTJOUR2, 1) + floatdiv(UTJ_QTETOTJOUR3, 1) + floatdiv(
       UTJ_QTETOTJOUR4, 1) + floatdiv(UTJ_QTETOTJOUR5, 1) + floatdiv(
       UTJ_QTETOTJOUR6, 1) + floatdiv(UTJ_QTETOTJOUR7, 1) + floatdiv(
       UTJ_QTETOTJOUR8, 1) + floatdiv(UTJ_QTETOTJOUR9, 1) + floatdiv(
       UTJ_QTETOTJOUR10, 1) + floatdiv(UTJ_QTETOTJOUR11, 1) + floatdiv(
       UTJ_QTETOTJOUR12, 1) + floatdiv(UTJ_QTETOTJOUR13, 1) + floatdiv(
       UTJ_QTETOTJOUR14, 1) + floatdiv(UTJ_QTETOTJOUR15, 1) + floatdiv(
       UTJ_QTETOTJOUR16, 1) + floatdiv(UTJ_QTETOTJOUR17, 1) + floatdiv(
       UTJ_QTETOTJOUR18, 1) + floatdiv(UTJ_QTETOTJOUR19, 1) + floatdiv(
       UTJ_QTETOTJOUR20, 1) + floatdiv(UTJ_QTETOTJOUR21, 1) + floatdiv(
       UTJ_QTETOTJOUR22, 1) + floatdiv(UTJ_QTETOTJOUR23, 1) + floatdiv(
       UTJ_QTETOTJOUR24, 1) + floatdiv(UTJ_QTETOTJOUR25, 1) + floatdiv(
       UTJ_QTETOTJOUR26, 1) + floatdiv(UTJ_QTETOTJOUR27, 1) + floatdiv(
       UTJ_QTETOTJOUR28, 1) + floatdiv(UTJ_QTETOTJOUR29, 1) + floatdiv(
       UTJ_QTETOTJOUR30, 1) + floatdiv(UTJ_QTETOTJOUR31, 1) FROM
        INVUTILISATIONJOUR U WHERE UTJ_ANNEE = 2010 AND UTJ_MOIS = 12 AND
         U.PRB_CODWRIN = B.PRB_CODWRIN)), 1) AS NUMERIC (12, 3)) UTJ_QTETOT
 
FROM HISPRODBRUT B2,
     INVPRODGENERIQUE G,
     HISPRODBRUT B
     LEFT JOIN INVINVENTAIRE I ON (I.PRB_CODWRIN = B.PRB_CODWRIN AND
      I.CAL_DTACTIVITE = '11/30/2010')
     LEFT JOIN INVINVENTAIRE J ON (J.PRB_CODWRIN = B.PRB_CODWRIN AND
      J.CAL_DTACTIVITE = '4/14/2011')
     LEFT JOIN INVNIVEAUSTOCK K ON (K.PRB_CODWRIN = B.PRB_CODWRIN AND
      K.NST_ANNEE = 2010 AND K.NST_MOIS = 12)
WHERE B.PRB_DTEFFET <= '4/14/2011' AND
      (B.PRB_DTFINEFFET >= '4/14/2011' OR
      B.PRB_DTFINEFFET IS NULL) AND
      B.PRB_ACTIF = 'T' AND
      B.PRB_PERIODEINV <= 0 AND
      B.PRG_CODMRIN = G.PRG_COD AND
      G.PRB_CODCALCULCOUT = B2.PRB_CODWRIN AND
      G.PRG_RENDSTAT = 'T' AND
      B2.PRB_DTEFFET <= '4/14/2011' AND
      (B2.PRB_DTFINEFFET >= '4/14/2011' OR
      B2.PRB_DTFINEFFET IS NULL)
GROUP BY B.PRG_CODMRIN 
ORDER BY 2,
         3,
         4,
         5,
         6
les 2 autres requetes utilisent exactement les mêmes champs et les mêmes tables
Ce qui m'intéresse c'est de savoir comment calculer la somme d'un champ ligne par ligne à partir de plusieurs requetes ...
jakouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h57   #6
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Citation:
Envoyé par jakouz Voir le message

valeur2 de champ1 de requete1 + valeur2 de champ1 de requete2 + valeur2 de champ1 de requete3

etc ...
au final j'obtiens encore 16 enregistrements

comment faire ? (quitte à faire une procedure stockée si nécessaire)
Pour une solution en SQL, c'est-à-dire non procédurale, il faudrait ajouter un numéro de ligne dans tes 3 requêtes pour pouvoir apparier ligne à ligne les 3 jeux de résultat par jointure. A moins qu'une de tes colonnes puisse jouer un rôle similaire, mais on ne peut pas le deviner sans connaître le rôle des colonnes. Sinon le moteur SQL ne saura jamais quelle ligne du résultat 1 doit correspondre à quelle ligne du résultat 2 ou du résultat 3.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h03   #7
Membre du Club
 
Inscription : mars 2002
Messages : 233
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 233
Points : 65
Points : 65
bonjour estofilo,

peux tu me donner un exemple simple en SQL de ton explication pour l'addition ligne par ligne d'un champ commun à 2 requetes par exemple
jakouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h11   #8
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
pas facile a comprendre

les 3 requetes ont-elles les memes criteres de selection. en d'autres termes:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM HISPRODBRUT B2,
     INVPRODGENERIQUE G,
     HISPRODBRUT B
     LEFT JOIN INVINVENTAIRE I ON (I.PRB_CODWRIN = B.PRB_CODWRIN AND
      I.CAL_DTACTIVITE = '11/30/2010')
     LEFT JOIN INVINVENTAIRE J ON (J.PRB_CODWRIN = B.PRB_CODWRIN AND
      J.CAL_DTACTIVITE = '4/14/2011')
     LEFT JOIN INVNIVEAUSTOCK K ON (K.PRB_CODWRIN = B.PRB_CODWRIN AND
      K.NST_ANNEE = 2010 AND K.NST_MOIS = 12)
WHERE B.PRB_DTEFFET <= '4/14/2011' AND
      (B.PRB_DTFINEFFET >= '4/14/2011' OR
      B.PRB_DTFINEFFET IS NULL) AND
      B.PRB_ACTIF = 'T' AND
      B.PRB_PERIODEINV <= 0 AND
      B.PRG_CODMRIN = G.PRG_COD AND
      G.PRB_CODCALCULCOUT = B2.PRB_CODWRIN AND
      G.PRG_RENDSTAT = 'T' AND
      B2.PRB_DTEFFET <= '4/14/2011' AND
      (B2.PRB_DTFINEFFET >= '4/14/2011' OR
      B2.PRB_DTFINEFFET IS NULL)
GROUP BY B.PRG_CODMRIN 
ORDER BY 2,
         3,
         4,
         5,
         6
ce code est-il IDENTIQUE pour toutes les requetes ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h17   #9
Membre du Club
 
Inscription : mars 2002
Messages : 233
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 233
Points : 65
Points : 65
oui les 3 requetes ont les mêmes critères de sélection : le FROM et le WHERE sont identiques. seul le calcul du champ UTJ_QTETOT change, tout le reste est identique
jakouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h23   #10
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Prenons un exemple simplifié dans le cas général: additionner la colonne col1 de 3 jeux de résultats avec une colonne col_id permettant d'apparier les jeux de résultat entre eux.
Ca donnerait quelque chose du genre:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT r1.col_id, r1.col1 + r2.col1 + r3.col1 FROM
(
 (SELECT col1,col_id FROM ... WHERE .. GROUP BY ..) r1
   JOIN
 (SELECT col1,col_id FROM ... WHERE .. GROUP BY ..) r2
   ON r1.col_id=r2.col_id
  JOIN
  (SELECT col1,col_id FROM ... WHERE .. GROUP BY ..) r3
    ON r3.col_id=r2.col_id
) total;
Si les sous-requêtes r1,r2,r3 renvoient N lignes résultats avec des col_id qui s'apparient parfaitement, le résultat de cette requête comportera N lignes avec les sommes de col1 par ligne.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h25   #11
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
dans ce cas il faut mettre les 3 calculs dans la meme requete

Code :
1
2
3
4
5
6
7
8
 
SELECT ....
            ....
            cast(floatdiv(sum((SELECT ......)), 1) AS NUMERIC (12, 3)) + -- TJ_QTETOT1 
            cast(floatdiv(sum((SELECT ......)), 1) AS NUMERIC (12, 3)) + --TJ_QTETOT2,
            cast(floatdiv(sum((SELECT ......)), 1) AS NUMERIC (12, 3)) AS TOTAL --TJ_QTETOT3
 
FROM ...
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 13h34   #12
Membre du Club
 
Inscription : mars 2002
Messages : 233
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 233
Points : 65
Points : 65
Olivier j'avais déjà testé ta proposition mais ça ne marche pas. l'exécution de la requete renvoie le message d'erreur suivant
Citation:
multiple rows in singleton select
jakouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 14h23   #13
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Dans une bases de données les lignes (et non pas les "enregistrements", cela n'existe pas et constitue une faute lourde de compréhension) n'ont pas d'ordre. Donc dire je veux additionner la ligne 1 avec la ligne 1 d'une autre requête n'a ps de sens, les données étant ensemblistes.
A lire sur le sujet : http://blog.developpez.com/sqlpro/p5...sont-des-ense/

Pour faire ce que vous voulez, il faut numéroter les lignes, soit das la table, soit dans une sous requête à l'aide de ROW_NUMBER (fonction de fenêtrage). Lire : http://sqlpro.developpez.com/article...clause-window/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 14h43   #14
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par jakouz Voir le message
oui les 3 requetes ont les mêmes critères de sélection : le FROM et le WHERE sont identiques. seul le calcul du champ UTJ_QTETOT change, tout le reste est identique
Et bien alors, additionnez chaque mode de calcul dans une seule et meme requete

Si par exemple vous avez :
requete 1:
Code SQL :
1
2
3
4
 
SELECT A + 2 AS UTJ_QTETOT 
FROM MaTable
WHERE machin = truc

requete 2 :
Code SQL :
1
2
3
4
 
SELECT B * 2 UTJ_QTETOT 
FROM MaTable
WHERE machine = truc

Faites :
Code SQL :
1
2
3
4
5
 
SELECT 
    (A + 2) + (B * 2) AS SOMME_UTJ_QTETOT 
FROM MaTable
WHERE Machine = truc
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h00   #15
Membre du Club
 
Inscription : mars 2002
Messages : 233
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 233
Points : 65
Points : 65
bonjour aieeeuuuuu

Citation:
additionnez chaque mode de calcul dans une seule et meme requete
me renvoie l'erreur
Citation:
multiple rows in selected select
jakouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h11   #16
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
sans le code, pas facile de répondre...

a priori, vous additionnez le résultat de deux SELECT qui renvoient plus d'une colonne...


Et nous n'avons pas non plus le code de vos autres requêtes, mais pour la première, pourquoi ne faites vous pas une jointure sur la table INVUTILISATIONJOUR plutôt que de faire une sous requête corrélée ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h19   #17
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Je n'avais pas vu la réponse de dehorter olivier

Et j'ai proposé la même chose.

Avec vos 3 modes de calculs, il y aurait surement moyen de faire quelque de chose de plus optimsé (et sans l'erreur )
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h30   #18
Membre du Club
 
Inscription : mars 2002
Messages : 233
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 233
Points : 65
Points : 65
désolé voici la requete simplifiée qui donne le message d'erreur "Multiple rows..." c'est le + entre les deux sum qui pose problème
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
SELECT cast(B.PRG_CODMRIN AS INTEGER) PRG_CODMRIN,
       MAX(B2.PRB_SEQUENCE) TRI_SEQUENCE,
       sum(I.INV_QTETOTUNITE * J.INV_PRIXUNITE)  PRIX_STOCK_INIT,
       sum(K.NST_STOCKOUV * J.INV_PRIXUNITE) PRIX_NST_STOCKOUV,
       sum(J.INV_QTETOTUNITE * J.INV_PRIXUNITE) PRIX_STOCK_FINAL,
 
       sum((SELECT UTJ_QTETOTJOUR1 + UTJ_QTETOTJOUR2
       FROM INVUTILISATIONJOUR U 
       WHERE UTJ_ANNEE = 2010 AND UTJ_MOIS = 12 AND
       U.PRB_CODWRIN = B.PRB_CODWRIN))
		+
       sum((SELECT UTJ_QTETOTJOUR1 + UTJ_QTETOTJOUR2
       FROM INVUTILISATIONJOUR U
       WHERE UTJ_ANNEE * 12 + UTJ_MOIS > 24132 AND
       UTJ_ANNEE * 12 + UTJ_MOIS < 24136 AND
       U.PRB_CODWRIN = B.PRB_CODWRIN))  UTJ_QTETOT
 
FROM HISPRODBRUT B2,
     INVPRODGENERIQUE G,
     HISPRODBRUT B
     LEFT JOIN INVINVENTAIRE I ON (I.PRB_CODWRIN = B.PRB_CODWRIN AND
      I.CAL_DTACTIVITE = '11/30/2010')
     LEFT JOIN INVINVENTAIRE J ON (J.PRB_CODWRIN = B.PRB_CODWRIN AND
      J.CAL_DTACTIVITE = '4/14/2011')
     LEFT JOIN INVNIVEAUSTOCK K ON (K.PRB_CODWRIN = B.PRB_CODWRIN AND
      K.NST_ANNEE = 2010 AND K.NST_MOIS = 12)
 
WHERE B.PRB_DTEFFET <= '4/14/2011' AND
      (B.PRB_DTFINEFFET >= '4/14/2011' OR
      B.PRB_DTFINEFFET IS NULL) AND
      B.PRB_ACTIF = 'T' AND
      B.PRB_PERIODEINV <= 0 AND
      B.PRG_CODMRIN = G.PRG_COD AND
      G.PRB_CODCALCULCOUT = B2.PRB_CODWRIN AND
      G.PRG_RENDSTAT = 'T' AND
      B2.PRB_DTEFFET <= '4/14/2011' AND
      (B2.PRB_DTFINEFFET >= '4/14/2011' OR
      B2.PRB_DTFINEFFET IS NULL)
GROUP BY B.PRG_CODMRIN
ORDER BY 2,3,4,5
jakouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h47   #19
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Il faut que vous fassiez le select des sommes, et non les sommes des select :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
SELECT cast(B.PRG_CODMRIN AS INTEGER) PRG_CODMRIN,
       MAX(B2.PRB_SEQUENCE) TRI_SEQUENCE,
       sum(I.INV_QTETOTUNITE * J.INV_PRIXUNITE)  PRIX_STOCK_INIT,
       sum(K.NST_STOCKOUV * J.INV_PRIXUNITE) PRIX_NST_STOCKOUV,
       sum(J.INV_QTETOTUNITE * J.INV_PRIXUNITE) PRIX_STOCK_FINAL,
 
       (SELECT SUM(UTJ_QTETOTJOUR1 + UTJ_QTETOTJOUR2)
       FROM INVUTILISATIONJOUR U 
       WHERE UTJ_ANNEE = 2010 AND UTJ_MOIS = 12 AND
       U.PRB_CODWRIN = B.PRB_CODWRIN)
		+
       (SELECT SUM(UTJ_QTETOTJOUR1 + UTJ_QTETOTJOUR2)
       FROM INVUTILISATIONJOUR U
       WHERE UTJ_ANNEE * 12 + UTJ_MOIS > 24132 AND
       UTJ_ANNEE * 12 + UTJ_MOIS < 24136 AND
       U.PRB_CODWRIN = B.PRB_CODWRIN)  UTJ_QTETOT
 
FROM HISPRODBRUT B2,
     INVPRODGENERIQUE G,
     HISPRODBRUT B
     LEFT JOIN INVINVENTAIRE I ON (I.PRB_CODWRIN = B.PRB_CODWRIN AND
      I.CAL_DTACTIVITE = '11/30/2010')
     LEFT JOIN INVINVENTAIRE J ON (J.PRB_CODWRIN = B.PRB_CODWRIN AND
      J.CAL_DTACTIVITE = '4/14/2011')
     LEFT JOIN INVNIVEAUSTOCK K ON (K.PRB_CODWRIN = B.PRB_CODWRIN AND
      K.NST_ANNEE = 2010 AND K.NST_MOIS = 12)
 
WHERE B.PRB_DTEFFET <= '4/14/2011' AND
      (B.PRB_DTFINEFFET >= '4/14/2011' OR
      B.PRB_DTFINEFFET IS NULL) AND
      B.PRB_ACTIF = 'T' AND
      B.PRB_PERIODEINV <= 0 AND
      B.PRG_CODMRIN = G.PRG_COD AND
      G.PRB_CODCALCULCOUT = B2.PRB_CODWRIN AND
      G.PRG_RENDSTAT = 'T' AND
      B2.PRB_DTEFFET <= '4/14/2011' AND
      (B2.PRB_DTFINEFFET >= '4/14/2011' OR
      B2.PRB_DTFINEFFET IS NULL)
GROUP BY B.PRG_CODMRIN
ORDER BY 2,3,4,5
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 15h56   #20
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
mais comme je disais, je pense que ce serait plus simple et plus performant en faisant une jointure sur la table INVUTILISATIONJOUR :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
SELECT cast(B.PRG_CODMRIN AS INTEGER) PRG_CODMRIN,
       MAX(B2.PRB_SEQUENCE) TRI_SEQUENCE,
       sum(I.INV_QTETOTUNITE * J.INV_PRIXUNITE)  PRIX_STOCK_INIT,
       sum(K.NST_STOCKOUV * J.INV_PRIXUNITE) PRIX_NST_STOCKOUV,
       sum(J.INV_QTETOTUNITE * J.INV_PRIXUNITE) PRIX_STOCK_FINAL,
 
       SUM(
             CASE 
                   WHEN UTJ_ANNEE = 2010 AND UTJ_MOIS = 12 
                   THEN UTJ_QTETOTJOUR1 + UTJ_QTETOTJOUR2
                   ELSE 0
              END
		+
              CASE 
                    WHEN UTJ_ANNEE * 12 + UTJ_MOIS > 24132 AND
                        UTJ_ANNEE * 12 + UTJ_MOIS < 24136 AND
                    THEN UTJ_QTETOTJOUR1 + UTJ_QTETOTJOUR2
                    ELSE 0
              END
         ) UTJ_QTETOT
 
FROM HISPRODBRUT B2,
     INVPRODGENERIQUE G,
     HISPRODBRUT B
     LEFT JOIN INVINVENTAIRE I ON (I.PRB_CODWRIN = B.PRB_CODWRIN AND
      I.CAL_DTACTIVITE = '11/30/2010')
     LEFT JOIN INVINVENTAIRE J ON (J.PRB_CODWRIN = B.PRB_CODWRIN AND
      J.CAL_DTACTIVITE = '4/14/2011')
     LEFT JOIN INVNIVEAUSTOCK K ON (K.PRB_CODWRIN = B.PRB_CODWRIN AND
      K.NST_ANNEE = 2010 AND K.NST_MOIS = 12)
      LEFT OUTER JOIN INVUTILISATIONJOUR U
       ON U.PRB_CODWRIN = B.PRB_CODWRIN
WHERE B.PRB_DTEFFET <= '4/14/2011' AND
      (B.PRB_DTFINEFFET >= '4/14/2011' OR
      B.PRB_DTFINEFFET IS NULL) AND
      B.PRB_ACTIF = 'T' AND
      B.PRB_PERIODEINV <= 0 AND
      B.PRG_CODMRIN = G.PRG_COD AND
      G.PRB_CODCALCULCOUT = B2.PRB_CODWRIN AND
      G.PRG_RENDSTAT = 'T' AND
      B2.PRB_DTEFFET <= '4/14/2011' AND
      (B2.PRB_DTFINEFFET >= '4/14/2011' OR
      B2.PRB_DTFINEFFET IS NULL)
GROUP BY B.PRG_CODMRIN
ORDER BY 2,3,4,5
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h58.


 
 
 
 
Partenaires

Hébergement Web