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

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Points : 2
    Points
    2
    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 882
    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 882
    Points : 53 063
    Points
    53 063
    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 +

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Points : 2
    Points
    2
    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 éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    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
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Points : 2
    Points
    2
    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 103
    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 103
    Points : 28 400
    Points
    28 400
    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

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Comme précisé hier, je suis sur MS SQL Server 2000. J'utilise l'analyseur de requêtes MS et Enterprise Manager

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

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Citation Envoyé par tartiflette59 Voir le message
    1ère proposition retourne : "Il manque un agrégat dans la liste de définition d'une instruction UPDATE."
    Que donne le résultat de ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      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)
    quelques lignes d'exemples pour qu'on comprenne mieux les données.

    Citation Envoyé par tartiflette59 Voir le message
    2ème proposition retourne : "Ligne 1 : syntaxe incorrecte vers 'PIH0'."
    Citation Envoyé par al1_24 Voir le message
    La syntaxe UPDATE ... FROM n'est pas conforme au standard SQL.
    Certes mais elle est totalement compatible SQL server que tartiflette59 a dit qu'il utilise dans son message d'hier à 11h. Par contre j'avais oublié qu'une fonction d'agrégat ne peut-être utilisé directement après le SET, je viens de refaire un test.
    msdn, UPDATE, voir partie "C. Using the UPDATE statement with information from another table",
    msdn, INFO : agrégats et clause SET dans l'instruction UPDATE

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

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Voici mon essai avec la base de test Northwind de SQL server en rajoutant un champ total dans la table Orders pour le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE dbo.Orders ADD  	total int NULL
    La requête suivante fonctionne (pour y arriver je suis passé par toutes les erreurs que tu as relevé dans les messages précédents )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    update  o
    set total=TotalCalc
    from orders o 
    inner join (select OrderID,sum(UnitPrice*Quantity) TotalCalc
                from [order details] 
                group by orderid)  od 
    on  o.orderid=od.OrderID
    Donc en poursuivant la même logique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE  PIH
    SET [Première Date de Réception]=MIN_ERD 
    FROM 
       [TBL$Purch_ Inv_ Header] PIH 
    INNER JOIN 
               (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
    ON T.[Document No_] = PIH.No_

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

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    alors ça marché ?

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