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 avec agrégat


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Par défaut Update avec agrégat
    Bonjour je souhaite modifier un champ d'une table et lui affecter un agrégat d'un champ d'une autre table ()

    requete du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update ENTETE
    set      ENTETE.Date=Min(LIGNES.Date)
    from    ENTETE inner join LIGNES on ENTETE.No=LIGNES.No
    group by LIGNES.No
    having Min(LIGNES.Date)>'01/01/2004'
    J'ai malheureusement le message :
    "Il manque un agrégat dans la liste de définition d'une instruction UPDATE."

    Pouvez-vous m'aider ?? MERCI

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    votre requête doit être du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE ENTETE
    SET    ENTETE.Date =  (SELECT Min(LIGNES.Date)
                           FROM   ENTETE  
                                  INNER JOIN LIGNES 
                                        ON ENTETE.No=LIGNES.No
                           GROUP BY LIGNES.No
                           HAVING Min(LIGNES.Date)>'01/01/2004')
    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/ * * * * *

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Par défaut
    Merci

    Voilà le véritable texte de la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    update [TBL$Purch_ Inv_ Header]
    set [Première Date de Réception]=
    (SELECT     distinct(MIN(PIL.[Expected Receipt Date]))
    FROM         dbo.[TBL$Purch_ Inv_ Header] PIH INNER JOIN
                          dbo.[TBL$Purch_ Inv_ Line] PIL ON PIH.No_ = PIL.[Document No_]
    GROUP BY PIL.[Document No_], PIL.Type, PIL.Quantity, PIL.[Expected Receipt Date]
    having  (PIL.Type > 0)
    	AND (PIL.Quantity <> 0)
    	AND (PIL.[Expected Receipt Date] > CONVERT(DATETIME, '2001-01-01 00:00:00', 102)))
    Maintenant j'obtiens le message suivant :
    Serveur*: Msg 512, Niveau 16, État 1, Ligne 1
    La sous-requête a retourné plusieurs valeurs. Cela n'est pas autorisé quand la sous-requête suit =, !=, <, <= , >, >= ou quand elle est utilisée en tant qu'expression.
    (sur MS SQL Server 2000)

  4. #4
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    "La sous-requête a retourné plusieurs valeurs." =>
    A la sortie du "SET=" il ne faut qu'une seule ligne en entrée. Autrement dit ta sous-requête ne devrait ramener qu'une ligne mais le message d'erreur indique que ta sous-requête en ramène plusieurs.

    "Il manque un agrégat dans la liste de définition d'une instruction UPDATE."=>
    Il y a un problème dans le regroupement mais j'ai du mal à voir comme je n'ai pas d'explication en français de ton problème.

    Si les clés primaires sont respectivement PIH.No_ et PIL.[Document No_], pourquoi on se crées des niveaux de regroupement supplémentaires (PIL.Type, PIL.Quantity) qui font qu'on aura potentiellement plusieurs ligne pour chaque PIL.[Document No_]. J'ai l'impression que tu as rajouté ces 2 champs plus pour des problèmes de syntaxe SQL que pour une vrai nécessité.

    En général on essaye de mettre les clause de Filtre d'abord dans le WHERE et ensuite seulement dans le HAVING qui sert en premier lieu aux filtres agrégés. A moins qu'en plus de MIN(PIL.[Expected Receipt Date]) tu veuilles SUM(PIL.Type) > 0 et/ou Sum(PIL.Quantity) <> 0

    Je te propose cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    update [TBL$Purch_ Inv_ Header] PIH0
    set [Première Date de Réception]=
    ( SELECT MIN_ERD 
       FROM 
         (SELECT PIL.[Document No_], MIN(PIL.[Expected Receipt Date]) MIN_ERD 
          FROM dbo.[TBL$Purch_ Inv_ Line] PIL
          WHERE PIL.Type > 0	AND PIL.Quantity <> 0
          GROUP BY PIL.[Document No_]
          HAVING MIN(PIL.[Expected Receipt Date])> CONVERT(DATETIME, '2001-01-01 00:00:00', 102)
          ) T
      WHERE T.[Document No_] = PIH0.No_ 
    )
    Essayes aussi ce code simplifié comme tu es sous SQL server
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    update  PIH0
    set [Première Date de Réception]=MIN(PIL.[Expected Receipt Date]) 
    FROM 
       [TBL$Purch_ Inv_ Header] PIH0 
    INNER JOIN
       dbo.[TBL$Purch_ Inv_ Line] PIL ON PIH.No_ = PIL.[Document No_]
    WHERE PIL.Type > 0	AND PIL.Quantity <> 0
    GROUP BY PIL.[Document No_]
    HAVING MIN(PIL.[Expected Receipt Date])> CONVERT(DATETIME, '2001-01-01 00:00:00', 102)

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Par défaut
    Merci Phili B de tes propositions.
    Je les ai testées mais j'obtiens toujours des messages d'erreur :
    • 1ère proposition retourne : "Il manque un agrégat dans la liste de définition d'une instruction UPDATE."
    • 2ème proposition retourne : "Ligne 1 : syntaxe incorrecte vers 'PIH0'."

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    La syntaxe UPDATE ... FROM n'est pas conforme au standard SQL.
    En précisant le SGBD que vous utilisez et sa version, les réponses proposées seront adaptées aux spécificités et limitations de celui-ci.
    Conseils à lire avant de poster sur ce forum
    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.

Discussions similaires

  1. requête UPDATE avec agrégat
    Par funkyjul dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/02/2008, 13h25
  2. UPDATE avec des variables Delphi ...
    Par Kokito dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/03/2004, 22h35
  3. Requete d'update avec concatenation !!
    Par chris92 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/02/2004, 12h05
  4. [version] Requete Update avec différentes versions de mySQL
    Par regbegpower dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/01/2004, 17h19
  5. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58

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