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 :

Update + SUM + Group BY


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Par défaut Update + SUM + Group BY
    J’ai une tableA ayant la structure suivante :

    ID1 ID2 Valeur
    1 11 10
    1 11 10
    2 22 15
    2 22 15

    Les colonnes (ID1, ID2 & Valeur) sont déjà renseignées.

    Le besoin est de sommer la "Valeur" par "ID1" et "ID2" et la mettre dans la colonne "Valeur_Total" (Update)

    càd la colonne "Valeur_Total" sera comme suit :

    Valeur_Totale
    20
    20
    30
    30

    J’ai fais cette requête, mais ça marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Update TableA
    Set Valeur_Total = (
      select  sum(Valeur)  
      from  TableA  
      group by  ID1, ID2
    )
    merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Un truc comme ça devrait marcher :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Update TableA a
    Set Valeur_Total = (select sum(Valeur) from TableA where id1 = A.ID1 and ID2 = A.ID2)

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Par défaut
    Bonjour,

    merci tomlev..

    l'exécution de ta requête a sommé toutes les valeurs sans grouper
    par ID1 et ID2

    ID1--ID2----Valeur------ValeurTotale
    1----11 -----10 ---------50
    1----11 -----10 ---------50
    2----22 -----15 ---------50
    2----22 -----15 ---------50

    alors que je souhaite avoir la somme comme il suit :

    ID1--ID2----Valeur------ValeurTotale
    1----11 -----10 ---------20
    1----11 -----10 ---------20
    2----22 -----15 ---------30
    2----22 -----15 ---------30

    je pense qu'il est essentiel d'ajouter un Group By (ID1 et ID2) dans la requête mais sans que ça soit ajouter dans le Select ...

    si vous avez une idée de comment peut on faire ceci...
    merci d'avance

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE tableA
    INNER JOIN (
        SELECT ID1, ID2, SUM(Valeur) AS somme_valeur
        FROM tableA
        GROUP BY ID1, ID2
    ) tmp ON tableA.ID1 = tmp.ID1 AND tableA.ID2 = tmp.ID2
    SET tableA.Valeur_Total = tmp.somme_valeur
    Si ça ne fonctionne pas à cause du fait que la sous-requête porte sur la table qui doit être mise à jour, fais de cette sous-requête une table temporaire et fais la jointure avec la table temporaire, éventuellement après l'avoir indexée si le volume de données à traiter est gros.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Par défaut
    j'ai exécuté cette requête :

    Citation Envoyé par CinePhil Voir le message
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE tableA
    INNER JOIN (
        SELECT ID1, ID2, SUM(Valeur) AS somme_valeur
        FROM tableA
        GROUP BY ID1, ID2
    ) tmp ON tableA.ID1 = tmp.ID1 AND tableA.ID2 = tmp.ID2
    SET tableA.Valeur_Total = tmp.somme_valeur
    comme résultat il affiche 2 erreurs :

    Incorrect syntax near the keyword 'INNER'.
    Incorrect syntax near 'tmp'.

    comment faire de la sous-requête une table temporaire ?!!!
    merci de m'indiquer la structure de la requête.

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par laure07 Voir le message
    comme résultat il affiche 2 erreurs :

    Incorrect syntax near the keyword 'INNER'.
    cela voudrait dire que ton outil ne connaît pas la syntaxe normalisée pour les jointures depuis 1999 ?
    => Jette-le !

    Incorrect syntax near 'tmp'.
    Et en plus il ne semble pas supporter les sous-requêtes !
    => Ressort le de la poubelle, casse-le, jette les morceaux !

    Pourtant :
    j'utilise SQL Server 2008
    Bizarre que ça plante !
    N'ayant jamais utilisé le SGBD paraît-il super génial de Petitmou, je ne peux t'aider davantage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bizarre, je ne vois pas comment c'est possible que ça ait sommé toutes les valeurs Tu as copié la requête exactement ou tu as l'as modifiée ?

    Au fait tu utilises quoi comme SGBD ? La requête que je t'ai donnée devrait marcher sous Oracle, mais pas forcément sur d'autres SGBD... Je viens de tester sur SQLite et SQL Server (Express et CE), aucun n'accepte d'alias sur la table mise à jour

  8. #8
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 431
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bizarre, je ne vois pas comment c'est possible que ça ait sommé toutes les valeurs Tu as copié la requête exactement ou tu as l'as modifiée ?

    Au fait tu utilises quoi comme SGBD ? La requête que je t'ai donnée devrait marcher sous Oracle, mais pas forcément sur d'autres SGBD... Je viens de tester sur SQLite et SQL Server (Express et CE), aucun n'accepte d'alias sur la table mise à jour

    j'utilise SQL Server 2008 : donc effectivement n'accepte d'alias sur la table mise à jour, et donc j'ai mis l'alias dans le Select :

    UPDATE TableA
    SET Valeur_Total = (SELECT sum(a.Valeur) FROM TableA a WHERE id1 = A.ID1 AND ID2 = A.ID2)

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par laure07 Voir le message
    j'utilise SQL Server 2008 : donc effectivement n'accepte d'alias sur la table mise à jour, et donc j'ai mis l'alias dans le Select :

    UPDATE TableA
    SET Valeur_Total = (SELECT sum(a.Valeur) FROM TableA a WHERE id1 = A.ID1 AND ID2 = A.ID2)
    Ah ben c'est normal alors, ça n'a plus du tout le même sens... avec la modification que tu as apportée, la condition dans le WHERE est vraie pour toutes les lignes, d'où le résultat que tu obtiens.

    Je ne suis pas sûr que tu puisse faire ça en une seule requête avec SQL Server. Par contre tu peux toujours faire une procédure stockée, ce serait assez simple (il suffit d'une boucle sur le résultat du SELECT ... GROUP BY)

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 4
    Par défaut
    Citation Envoyé par laure07 Voir le message
    j'utilise SQL Server 2008 : donc effectivement n'accepte d'alias sur la table mise à jour, et donc j'ai mis l'alias dans le Select :
    L'instruction Update accepte les alias depuis au moins la version 2005 sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE T1 Set X=1
    FROM Table_Name T1
    Quant à la mise à jour avec la somme d'une valeur d'une autre table avec jointure, il suffit de faire un outer apply du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE T1 Set X=ISNULL(SUMVAL, 0)
    FROM TableName T1
    OUTER APPLY (SELECT SUM(VALEUR) AS SUMVAL FROM TableName T2 WHERE T1.KEY=T2.KEY) OA1

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/10/2010, 14h00
  2. update + sum + group by
    Par PhYx dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/06/2008, 15h44
  3. requete sql deux fois sum groupe by
    Par DIDIDIDA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/03/2008, 13h04
  4. Update + SUM() ?
    Par dark_vidor dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/01/2006, 22h51
  5. update avec group by
    Par slc dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/10/2004, 13h44

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