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 :

Requête avec union et distinct


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de bourvil
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : Israël

    Informations forums :
    Inscription : Juin 2002
    Messages : 411
    Points : 329
    Points
    329
    Par défaut Requête avec union et distinct
    bonjour,

    J'ai une requete SQL un peu compliquee:
    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
    17
    18
     
    SELECT tClients.Date GDate,  COUNT(DISTINCT tClients.ClientID) 
    FROM (
     
       SELECT Clients.ClientID, Clients.Date
       FROM Clients
       WHERE CreateDate
       BETWEEN '2011-11-29' AND '2011-12-12'
       GROUP BY ClientID
     UNION
       SELECT ClientID, DATE( CreateDate ) `Date`
       FROM CRM_TasksClients
       INNER JOIN CRM_Tasks
       USING ( TaskID )
       WHERE  DATE( CreateDate ) BETWEEN '2011-11-29'
       GROUP BY ClientID
    )tClients
    GROUP BY GDate
    je voudrais que les ClientID dans le count soit unique,toute date confondue et ce n'est pas le cas actuellement. le distinct ne s'applique que sur le group by.

    avez vous une idee?

    merci bcp
    Franchement, je suis capable du meilleur comme du pire, mais, dans le pire, c'est moi le meilleur.
    Coluche

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Bonjour,

    tous les champs du select doivent être dans le group by, sauf fonctions (count, max, min, ...)

    donc tes group by client sont faux, il faut grouper par client et date
    Le Porc est un loup pour le Porc.

  3. #3
    Membre averti Avatar de bourvil
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : Israël

    Informations forums :
    Inscription : Juin 2002
    Messages : 411
    Points : 329
    Points
    329
    Par défaut
    merci
    mes comme tu l'ecris
    tous les champs du select doivent être dans le group by, sauf fonctions (count, max, min, ...)
    j'ai 2 champs ds mon select
    1. gdate - qui est un group by
    2.clientid - qui est un count

    exactement comme tu as dis
    ma requete ne me donne pas d'erreur mais compte les doublons Clientid

    merci
    Franchement, je suis capable du meilleur comme du pire, mais, dans le pire, c'est moi le meilleur.
    Coluche

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Un peu d'effort dans votre écriture ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT Clients.ClientID, Clients.Date
       FROM Clients
       WHERE CreateDate
       BETWEEN '2011-11-29' AND '2011-12-12'
       GROUP BY ClientID
    Ca c'est faux, et ne veut rien dire.

    Si vous avez déjà des doublons dans votre table Clients il faut utilisez une syntaxe de ce type, vu que vous ne faites aucune opération d'agrégation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT distinct Clients.ClientID, Clients.Date
       FROM Clients
       WHERE CreateDate
       BETWEEN '2011-11-29' AND '2011-12-12'
    Ensuite :
    Votre 1ere requête, avec la bonne syntaxe utilisée va vous compter, pour chaque date donnée, le nombre distinct de client.

    Donc je ne vois pas bien le problème ?
    Vous cherchez peut-être autre chose en fait ?

    Indiquez un jeu de donnée d'entrée / sortie pour que l'on comprenne mieux.

  5. #5
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Je pense qu'il parlait des group by présents dans les requêtes UNION. Que tu peut d'ailleur supprimer et remplacer par un distinct.

    Ici ta requête est correcte si tu cherche à compter un seul id client par date.

    je voudrais que les ClientID dans le count soit unique,toute date confondue et ce n'est pas le cas actuellement. le distinct ne s'applique que sur le group by.
    Pour être sûre : ce que tu veux c'est que si un client apparait 2 fois mais avec 2 dates différentes c'est qu'il ne soit compté qu'une fois ?

    Si oui --> je ne comprend pas trop le pourquoi et dans ce cas sous quelle date le client doit-il être compté ?

    Si non --> pourrais-tu nous montrer un jeu d'essai et le résultat attendu pour que nous puissions bien comprendre ton problème.

    Pour ta deuxième sous-requête il te manque la fin du BETWEEN aussi.
    ~ Lola ~

  6. #6
    Membre averti Avatar de bourvil
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : Israël

    Informations forums :
    Inscription : Juin 2002
    Messages : 411
    Points : 329
    Points
    329
    Par défaut
    merci a vous tous
    ->punkoff: J'ai corrige ma faute en mettant distinct au lieu de group by.
    ->lola06:
    Pour être sûre : ce que tu veux c'est que si un client apparait 2 fois mais avec 2 dates différentes c'est qu'il ne soit compté qu'une fois ?

    Si oui --> je ne comprend pas trop le pourquoi et dans ce cas sous quelle date le client doit-il être compté ?
    Apres avoir verifier il s'avere que le client peut apparaitre 2 fois avec 2 dates differentes.

    donc dans ce cas la, ma requete fonctionne bien

    encore merci
    Franchement, je suis capable du meilleur comme du pire, mais, dans le pire, c'est moi le meilleur.
    Coluche

  7. #7
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Je pense qu'il parlait des group by présents dans les requêtes UNION. Que tu peut d'ailleur supprimer et remplacer par un distinct.
    En fait on peut même supprimer le distinct, le UNION s'en chargera.

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

Discussions similaires

  1. Optimisation requête avec UNION
    Par vaccary dans le forum SQL
    Réponses: 7
    Dernier message: 19/07/2011, 14h06
  2. [AC-97] sous requête avec UNION
    Par SpyKe974 dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/03/2011, 14h44
  3. [UNION] - Perte de résultat sur une requête avec UNION
    Par lecail65 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/09/2009, 14h30
  4. Probleme, requète avec UNION?
    Par weetos dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/05/2008, 14h43
  5. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02

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