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 :

[SQL] problème de SUM dans un update


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Par défaut [SQL] problème de SUM dans un update
    Bonjour,

    SGBD: Ingres (oui c'est encore utilisé )
    Je dispose de 2 tables :

    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
     
    Table ope_w :
     
    Id   Montant   Code
    ---  --------  -----
    1Z   21498,93  2101
    S3   94523,84  2202
    ..   ........  ....
     
    Table som_ope_w
     
    Id   Somme     Somme_A  Somme_B
    ---  --------  -------  --------
    1Z   21498,93  21498,93  0
    S3   94523,84  94523,84  0
    ..   ........  ....
    Le but de la requete que je cherche a creer est de remplir la table som_ope_w a partir de la table ope_w, en remplissant pour un Id donné la somme de tous les montants qu'il a, et dans Somme_A et Somme_B la somme des montants de cet Id pour certains codes specifiques

    Ma 1ere idee etait de faire ceci avec une premiere d'insertion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    insert into som_ope_w
    select   id,
             sum(montant),
             0,
             0,
             0
    from     ope_w
    group by id
    Puis differentes requetes d'update pour completer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update som_ope_w
    from ope_w g
    set somme_a = sum(g.montant)
    where g.code = '2101' or g.c_ope = '2203' // oui code est un char(4)
    A ce point la, la 1ere requete fonctionne parfaitement, mais la 2eme echoue et j'ai un message d'erreur me disant qu'il n'est pas possible de mettre un sum dans un set
    E_US0B70 line 1, aggregate function 'sum' not allowed in this context.
    j'ai donc recherche un peu sur google et sur le forum , j'ai trouve quelques reponses interessantes, comme
    http://www.developpez.net/forums/sho...d.php?t=181301
    http://www.developpez.net/forums/showthread.php?t=84569
    http://www.developpez.net/forums/showthread.php?t=81835

    ou la reponse qui ressort a chaque fois et d'utiliser une requete du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update xxx
    from yyy
    set a = (select sum(b) from c)
    j'ai donc essaye d'appliquer cela a mes requetes, ce qui donne au choix directement dans le insert :

    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
     
    insert into som_ope_w
    select id,
           (select   sum(montant)
            from     ope_w
            group by id),
           (select   sum(montant)
            from     ope_w
            where    ope_w.code = '2101'
            group by id),
           (select   sum(montant)
            from     ope_w
            where    ope_w.code = '2102'
            group by id),
    from   ope_w
    j'ai essaye cela, diverses combinaisans avec ou sans group by, avec ou sans from dans la requete principale, avec un seul champ mis a jour et les autres a 0 , bref rien n'y fait j'ai toujours un message d'erreur peu explicite
    E_US09C5 line 1, Syntax error on 'select'. The correct syntax is:
    (avec a la suite la syntaxe classique d'un select)

    J'ai aussi essaye de faire la meme chose avec un update et un set somme_a = (select sum(montant) , mais ca me donne la meme erreur

    Voila , desole pour l'enorme bloc de texte mais j'ai essaye de bien (trop ? ) detailler et de montrer que j'avais essaye et cherche pas mal avant de poster.

    Merci de votre temps et de vos reponses

  2. #2
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Je pense qu'un case pourrait t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO som_ope_w
    SELECT   id,
             sum(montant),
             sum(case code when '2101' then montant when '2203' then montant else 0 end),
             0,
             0
    FROM     ope_w
    GROUP BY id

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Par défaut
    Ca me donne l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    E_US09C5 line 1, Syntax error on 'code'.  The correct syntax is:
     
    SELECT [ALL|DISTINCT] target_list
          FROM table(s)
          [WHERE search_cond]
          [GROUP BY col(s)]
          [HAVING search_cond]
     [UNION subselect]
     [ORDER BY col(s)]
     
    (Mon Mar 12 14:47:07 2007)
    je n'avais jamais entendu de la possibilite d'utiliser des case en Ingres, et la doc de reference n'a pas l'air de donner des reponses la dessus non plus ... je vais essayer de poursuivre un petit peu ma recherche dans cette direction mais sans grand espoir.

    Merci de ta reponse en tout cas chrifo

  4. #4
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    L'erreur étant signalée sur "code", as-tu essayé l'autre syntaxe du case ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO som_ope_w
    SELECT   id,
             sum(montant),
             sum(case when code in ('2101','2203') then montant else 0 end),
             0,
             0
    FROM     ope_w
    GROUP BY id
    On ne sait jamais ...

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Par défaut
    Nop ca me donne le meme message d'erreur a part qu'il est sur "when" au lieu d'etre sur "code"

    j'ai fait quelques tests bcp plus simple avec le case, comme ca par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CASE CODE 
             WHEN '1234' THEN '0000'
           END
    FROM   OPE_W
    et il m'envoi cette erreur :

    E_US0837 line 1, FROM clause is mandatory when a column ('case') has been specified in the target list.
    qui renforce mon idee comme quoi le case est pas supporte par Ingres, vu qu'il a meme pas compris que c'etait un mot cle et a pris ca pour un nom de colonne

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Par défaut
    Bon alors j'ai rien trouve de plus sur les case, mais par contre j'ai temporairement (ou pas) choisi de passer par 3 tables temporaires pour calculer les sommes, puis de faire un update de som_ope_s a partir de celles la ...

    Mais bon, ca me fait faire une 15aine de requetes au lieu d'une seule, et je manipule des gros volumes de donnees alors que ca pourrait p-e etre evite, donc cette solution ne me satisfait pas vraiment

    Si quelqu'un a une idee, je suis preneur.

    Merci ~

Discussions similaires

  1. [SQL] problème d'insertion dans ma base ou problème de requête sql
    Par maroco31 informatik dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/06/2007, 08h16
  2. [SQL] Problème de majuscule dans ma requête SQL
    Par nicolas2603 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/04/2007, 14h25
  3. [SQL] Problème résultat checkbox dans requête SQL
    Par Skeud007 dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 02/07/2006, 15h02
  4. [SQL] Problème d'addition dans requete SQL
    Par cheers94wow dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/05/2006, 15h05
  5. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50

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