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

Requêtes et SQL. Discussion :

Erreur de syntaxe requête union


Sujet :

Requêtes et SQL.

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut Erreur de syntaxe requête union
    Bonjour,

    J'ai une requête qui me liste le CA par négociateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COLLABORATEURS.NomFamille, Count(AFFAIRES.Réfaffaires) AS Volume, Sum(AFFAIRES.[Montant honoraires HT]) AS CA
    FROM AFFAIRES INNER JOIN COLLABORATEURS ON AFFAIRES.réfnégosortant=COLLABORATEURS.Réfnégociateur
    GROUP BY COLLABORATEURS.NomFamille, AFFAIRES.réfnégosortant, AFFAIRES.[Transaction aboutie]
    HAVING (((AFFAIRES.[Transaction aboutie])=True));
    Tout va bien. Cependant, je voudrais rajouter un autre négo qui n'apparait pas dans cette requête car le CA qu'il réalise ne provient pas du même sum(AFFAIRES.....).
    Il se trouve que la refnégo de cet individu n'est pas associé dans la table AFFAIRES à un CA. On sait que c'est lui qui a réalisé ce CA quand le champ [Bail rédigé par] est coché (c'est un champ oui/non).

    Donc j'ai pensé faire une union avec la précédente requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UNION
    
    SELECT iif(AFFAIRES.[Bail rédigé par]=-1,"HAW") AS Nom, iif(count(AFFAIRES.[Bail rédigé par])=-1,1,"-") AS Volume, sum(AFFAIRES.[Montant HT] AS CA
    FROM AFFAIRES
    GROUP BY COLLABORATEURS.NomFamille
    HAVING (((AFFAIRES.[Transaction aboutie])=True));

    Et là c'est le drame ! Fonctionne pas ; message d'erreur = vous avez essayé d'exécuter une requête ne comprenant pas l'expression en gras comme une partie de la fonction d'agrégat.

    Une idée

  2. #2
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    J'ai avancé un peu !!
    J'ai remplacé dans l'union
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iif(AFFAIRES.[Bail rédigé par]=-1,"HAW") AS Nom
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iif(COLLABORATEURS.NomFamille="HAW","HAW") AS Nom
    et j'ai ma feuille de données qui s'ouvre mais sans afficher le nom de famille HAW....

    Pourquoi ?

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    J'avance encore.
    J'ai fait des modif de tel sorte que le champ [Bail rédigé par] ait en propriété une liste de choix avec les valeurs ou et non.
    Voici en miniature ce que ça donne.
    J'a mis en rouge ce que je voulais qu'il apparaisse et barré en noir avec la mention "NEANT" une ligne car elle n'a pas lieu d'être (je ne sais pas pourquoi elle est là)
    Et voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT COLLABORATEURS.NomFamille AS Nom, Count(AFFAIRES.Réfaffaires) AS Volume, Sum(AFFAIRES.[Montant honoraires HT]) AS CA
    FROM AFFAIRES INNER JOIN COLLABORATEURS ON AFFAIRES.réfnégosortant=COLLABORATEURS.Réfnégociateur
    GROUP BY COLLABORATEURS.NomFamille, AFFAIRES.réfnégosortant, AFFAIRES.[Transaction aboutie]
    HAVING (((AFFAIRES.[Transaction aboutie])=True));
     
    UNION SELECT iif(COLLABORATEURS.NomFamille="HAW","HAW") AS Nom, iif(count(AFFAIRES.[Bail rédigé par])=-1,count(AFFAIRES.[Bail rédigé]),"-") AS Volume, iif(sum(AFFAIRES.[Montant HT])>0,sum(AFFAIRES.[Montant HT]),"-")  AS CA
    FROM AFFAIRES INNER JOIN COLLABORATEURS ON AFFAIRES.réfnégosortant=COLLABORATEURS.Réfnégociateur
    GROUP BY COLLABORATEURS.NomFamille,AFFAIRES.réfnégosortant, AFFAIRES.[Transaction aboutie]
    HAVING (((AFFAIRES.[Transaction aboutie])=True));
    Quand je remplace le -1 de iif(count(AFFAIRES.[Bail rédigé par])=-1 par "OUI" (vu que c'est une zone de liste déroulante), ça me dit erreur de syntaxe....

    Une aide please

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Pour la deuxième requête, peut-être avec
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UNION
     
    SELECT "HAW" AS Nom, Count(AFFAIRES.Réfaffaires) AS Volume, Sum(AFFAIRES.[Montant honoraires HT]) AS CA
    FROM AFFAIRES
    WHERE (((AFFAIRES.[Bail rédigé par])=True) AND ((AFFAIRES.[Transaction aboutie])=True));
    Pour la première je pense qu'on peut transformer la clause HAVING en WHERE
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COLLABORATEURS.NomFamille AS Nom, Count(AFFAIRES.Réfaffaires) AS Volume, Sum(AFFAIRES.[Montant honoraires HT]) AS CA
    FROM AFFAIRES INNER JOIN COLLABORATEURS ON AFFAIRES.réfnégosortant=COLLABORATEURS.Réfnégociateur
    WHERE (((AFFAIRES.[Transaction aboutie])=True))
    GROUP BY COLLABORATEURS.NomFamille, AFFAIRES.réfnégosortant, AFFAIRES.[Transaction aboutie];
    A+

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Merci LedZep,

    On avance, cependant avec cette union
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UNION
     
    SELECT "HAW" AS Nom, Count(AFFAIRES.Réfaffaires) AS Volume, Sum(AFFAIRES.[Montant HT]) AS CA
    FROM AFFAIRES
    WHERE (((AFFAIRES.[Bail rédigé par])=True) AND ((AFFAIRES.[Transaction aboutie])=True));
    ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(AFFAIRES.Réfaffaires)  AS Volume
    mais ça devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Count(AFFAIRES.[Bail rédigé par....])
    si [Bail rédigé] = "OUI" et pas True car ce n'est plus une case à cocher mais une liste de choix avec en varible OUI et NON.
    Quand je fais un IIf(Count....................) = "OUI", ça ne marche pas...

    Et là, tel que tu m'as donné la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((AFFAIRES.[Bail rédigé par])=True) AND ((AFFAIRES.[Transaction aboutie])=True));
    , ça ne me compte pas ce qu'il faut...

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    [Bail rédigé] = "OUI" et pas True car ce n'est plus une case à cocher mais une liste de choix avec en varible OUI et NON
    Si c'est toujours un champ OUI/NON, peut importe qu'on l'affiche en case à cocher ou en liste de choix.
    En SQL c'est True ou False (ou -1 ou 0).

    La fonction de regroupement Count, compte des lignes.
    Toutes, si on met Count(*).
    Seulement celles pour lesquelles <champ> est non Null si on met Count(<Champ>).
    Ça vient peut-être de là ?

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par LedZeppII Voir le message
    Si c'est toujours un champ OUI/NON, peut importe qu'on l'affiche en case à cocher ou en liste de choix.
    En SQL c'est True ou False (ou -1 ou 0).
    Ce n'est plus un champ OUI/NON... Il est en texte

    Citation Envoyé par LedZeppII Voir le message
    La fonction de regroupement Count, compte des lignes.
    Toutes, si on met Count(*).
    Seulement celles pour lesquelles <champ> est non Null si on met Count(<Champ>).
    Ça vient peut-être de là ?
    Euh, j'essaie de traduire ce que tu viens de dire sur ma requête mais je ne vois plus trop comment faire.
    En l'état actuel des choses, j'ai bien le nom qu'il faut, la somme Ht qu'il faut, mais pas le compte

  8. #8
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    La deuxième requête peut donc s'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UNION
     
    SELECT "HAW" AS Nom, Count(AFFAIRES.Réfaffaires) AS Volume, Sum(AFFAIRES.[Montant honoraires HT]) AS CA
    FROM AFFAIRES
    WHERE (((AFFAIRES.[Bail rédigé par])="OUI") AND ((AFFAIRES.[Transaction aboutie])=True));
    Si le compte de AFFAIRES.Réfaffaires est incorrect, cela peut être du au fait que des lignes ont AFFAIRES.Réfaffaires à Null.

    Dans ce cas et si pour une AFFAIRES.Réfaffaires ont un seul AFFAIRES.[Montant honoraires HT],
    tu remplaces Count(AFFAIRES.Réfaffaires) par Count(*).

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Je ne comprends pas !
    ça marche (tant mieux) et je t'en remercie

    Mais pourquoi quand moi je mettais "OUI" j'avais un message d'erreur me disant erreur de syntaxe ou "type de données incompatible...". C'est injuste, il y a de la discrimination !

    Vraiment merci. En plus de m'avoir aidée, tu as drôlement simplifié mes requêtes.

    Cependant, je retombe sur le même problème où lorsqu'un collaborateur n'a pas fait de CA, il n'est pas listé alors que moi je voudrais tous les avoir dans la feuille de données avec un "-" quand il n' y rien !

  10. #10
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,
    Mais pourquoi quand moi je mettais "OUI" j'avais un message d'erreur
    Tu étais bien dans la clause WHERE ?

    lorsqu'un collaborateur n'a pas fait de CA, il n'est pas listé alors que moi je voudrais tous les avoir dans la feuille de données avec un "-" quand il n' y rien
    C'est pour la première requête ?

    Je vais essayer de récapituler les différents cas.
    1. AFFAIRES.[Bail rédigé par])<>"OUI" (ou = "NON")
      1. Le collaborateur a un CA
        Il est présent dans les tables AFFAIRES et COLLABORATEURS
      2. Le collaborateur n'a pas de CA
        Il est présent dans ???
    2. AFFAIRES.[Bail rédigé par])="OUI"
      Le collaborateur n'est pas dans la table COLLABORATEURS ou il n'y a pas de correspondance entre la table AFFAIRES et la table COLLABORATEURS
    Ce qu'il faut c'est pouvoir caractériser le cas 1.b
    Est que le collaborateur existe dans la table COLLABORATEURS mais n'a pas de correspondance dans la table AFFAIRES ?
    Ou bien il a des correspondances dans la table AFFAIRES mais avec AFFAIRES.[Transaction aboutie]=False ?
    Ou encore son Sum(AFFAIRES.[Montant honoraires HT]) est égal à zéro ?

    A+

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

Discussions similaires

  1. Erreur de syntaxe requête
    Par ciols dans le forum Langage SQL
    Réponses: 10
    Dernier message: 31/10/2013, 11h53
  2. Erreur de syntaxe Requête
    Par mesbec dans le forum Access
    Réponses: 1
    Dernier message: 10/07/2013, 14h56
  3. [PDO] erreur de syntaxe requête préparé et condition LIMIT
    Par le nOoB dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/06/2012, 08h50
  4. [AC-2003] Erreur de syntaxe requête UPDATE
    Par hellomom dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 01/05/2009, 13h24
  5. Erreur avec une requête UNION
    Par paradeofphp dans le forum Requêtes
    Réponses: 1
    Dernier message: 28/02/2008, 14h30

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