Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2012, 12h38   #1
Membre confirmé
 
Avatar de bourvil
 
Inscription : juin 2002
Messages : 352
Détails du profil
Informations personnelles :
Localisation : Israël

Informations forums :
Inscription : juin 2002
Messages : 352
Points : 217
Points : 217
Par défaut Requête avec union et distinct

bonjour,

J'ai une requete SQL un peu compliquee:
Code :
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
bourvil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 13h11   #2
Membre émérite
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 570
Détails du profil
Informations personnelles :
Nom : Homme Tony
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 570
Points : 821
Points : 821
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.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 14h04   #3
Membre confirmé
 
Avatar de bourvil
 
Inscription : juin 2002
Messages : 352
Détails du profil
Informations personnelles :
Localisation : Israël

Informations forums :
Inscription : juin 2002
Messages : 352
Points : 217
Points : 217
merci
mes comme tu l'ecris
Citation:
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
bourvil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 14h20   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Un peu d'effort dans votre écriture ...

Code :
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 :
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 14h21   #5
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
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.

Citation:
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 ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 14h47   #6
Membre confirmé
 
Avatar de bourvil
 
Inscription : juin 2002
Messages : 352
Détails du profil
Informations personnelles :
Localisation : Israël

Informations forums :
Inscription : juin 2002
Messages : 352
Points : 217
Points : 217
merci a vous tous
->punkoff: J'ai corrige ma faute en mettant distinct au lieu de group by.
->lola06:
Citation:
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
bourvil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 09h55   #7
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
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.
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h51.


 
 
 
 
Partenaires

Hébergement Web