IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

additionner des champs enregistrement par enregistrement


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 240
    Points : 102
    Points
    102
    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)

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 804
    Points
    30 804
    Par défaut
    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 240
    Points : 102
    Points
    102
    Par défaut
    voici la 1ere requete (les 2 autres sont similaires)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    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+
    Merci d'ajouter un sur les tags qui vous ont aidé

  5. #5
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 240
    Points : 102
    Points
    102
    Par défaut
    voici la requete simplifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    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.

  7. #7
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 240
    Points : 102
    Points
    102
    Par défaut
    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

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    pas facile a comprendre

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?
    Merci d'ajouter un sur les tags qui vous ont aidé

  9. #9
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 240
    Points : 102
    Points
    102
    Par défaut
    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

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    dans ce cas il faut mettre les 3 calculs dans la meme requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...
    Merci d'ajouter un sur les tags qui vous ont aidé

  12. #12
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 240
    Points : 102
    Points
    102
    Par défaut
    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
    multiple rows in singleton select

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 774
    Points : 52 744
    Points
    52 744
    Billets dans le blog
    5
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  14. #14
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT A + 2 AS UTJ_QTETOT 
    FROM MaTable
    WHERE machin = truc

    requete 2 :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT B * 2 UTJ_QTETOT 
    FROM MaTable
    WHERE machine = truc

    Faites :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT 
        (A + 2) + (B * 2) AS SOMME_UTJ_QTETOT 
    FROM MaTable
    WHERE Machine = truc

  15. #15
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 240
    Points : 102
    Points
    102
    Par défaut
    bonjour aieeeuuuuu

    additionnez chaque mode de calcul dans une seule et meme requete
    me renvoie l'erreur
    multiple rows in selected select

  16. #16
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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 ?

  17. #17
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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 )

  18. #18
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    240
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 240
    Points : 102
    Points
    102
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  19. #19
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Il faut que vous fassiez le select des sommes, et non les sommes des select :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  20. #20
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    mais comme je disais, je pense que ce serait plus simple et plus performant en faisant une jointure sur la table INVUTILISATIONJOUR :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Pourcentage de champs NULL par enregistrement
    Par pprevel dans le forum Requêtes
    Réponses: 13
    Dernier message: 21/10/2014, 11h46
  2. Somme des champs d'un enregistrement
    Par Arbraz dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 04/11/2013, 17h55
  3. [AC-2007] créer des étiquettes avec un enregistrement par page
    Par crouic5 dans le forum Access
    Réponses: 2
    Dernier message: 28/03/2012, 16h30
  4. Réponses: 9
    Dernier message: 10/01/2006, 16h27
  5. Delphi7-DOA accéder au champ d'un enregistrement par indice
    Par delphim dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/05/2005, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo