Menu

SQL group by avec plusieurs conditions

fredoalex - 20 févr. 2018 à 15:32 - Dernière réponse : Reivax962 3238 Messages postés jeudi 16 juin 2005Date d'inscription 22 juin 2018 Dernière intervention
- 26 févr. 2018 à 10:33
Bonjour à tous,

je souhaite pouvoir grouper les resultat d'une requête par date et par client.
Or lorsque je fait un Group by seul la première condition est groupé (soit la date soit le client).
Voici mon code
SELECT   "bledatl","grplib", count(*) as "Nb_lignes total",
count( case  when ( ("cmedatl1" - "cmedatc" ) <=2 and ( "bledatl" - "cmedatl1"  )< 1 ) or (( "cmedatl1" - "cmedatc" ) >2 and ( "bledatl" - "cmedatl1"  )< 0 ) THEN 1 end ) as "Nb lignes en avance",

count(case when ( ("cmedatl1" - "cmedatc" ) <=2 and ( "bledatl" - "cmedatl1"  )= 1)  or (( "cmedatl1" - "cmedatc" ) >2 and ( "bledatl" - "cmedatl1"  )= 0 )then 1 end) as "Nb lignes à l'heure",

count( case when ( ("cmedatl1" - "cmedatc" ) <=2 and ( "bledatl" - "cmedatl1"  )> 1 ) or (( "cmedatl1" - "cmedatc" ) >2 and ( "bledatl" - "cmedatl1"  )> 0) then 1 end) as "Nb ligne en retard"


 FROM "fac_coment" LEFT JOIN "fac_bldet" ON "bldretab" = "cmeetab" AND "bldrnum" = "cmenucom" LEFT JOIN "fac_blent" ON "bldetab" = "bleetab" AND "bldnum" = "blenum"
left join "fac_groupe_ent" on "grplib"="grplib"
 WHERE "bledatl" >= '2018.01.01' 
group by  "bledatl",grplib
order by "bledatl",grplib


EDIT : Ajout des balises de code (la coloration syntaxique).

Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
Jordane45


Merci d'avance pour votre aide
Afficher la suite 

Votre réponse

8 réponses

yg_be 5862 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 24 juin 2018 Dernière intervention - 20 févr. 2018 à 16:34
0
Merci
bonjour, comme plusieurs tables ont un champ nommé grplib, je suggère de partout mettre le nom de la table devant le nom du champ.
quand tu écris "seul la première condition est groupé", veux-tu dire que tu obtiens plusieurs lignes avec les mêmes valeurs pour les deux champs?
Bonjour Yg_ Be

Voici un exemple de ce que j'obtiens

Bledatl Grplib Nb_lignes total Nb_ lignes en avance Nb lignes à l'heure Nb lignes en retard
02/02/18 client1 100 20 50 30
02/02/18 client2 100 20 50 30
02/02/18 client3 100 20 50 30
03/02/18 client1 150 70 70 10
03/02/18 client2 150 70 70 10
03/02/18 client3 150 70 70 10


Ainsi dans ma condition Group By seul le critère "Bledatl" est pris en compte alors que souhaite voir les chiffre par date (Bledatl) puis par client (Grplib).

J espère que j'ai été plus claire
yg_be 5862 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 24 juin 2018 Dernière intervention > fredoalex - 20 févr. 2018 à 17:14
veux-tu dire que tu voudrais que les nombres de lignes soient spécifiques à chaque client?
as-tu suivi ma suggestion je suggère de partout mettre le nom de la table devant le nom du champ grplib?
dans quelles tables se trouve grplib?
et dans quelles tables se trouvent les champs dont tu fais des count?
Bonjour,

Oui effectivement il faut que chaque ligne soit spécifique à chaque date et client.

Oui j'ai essayer de mettre les nom de table avant le nom de champ mais ça n'a rien changé.

Ils se trouvent sur les tables Fac_coment, fac_bldet et fac_blent
yg_be 5862 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 24 juin 2018 Dernière intervention > fredoalex - 21 févr. 2018 à 09:46
tu n'as pas répondu à mes deux questions "dans quelles tables ...".
que donne le select avec uniquement les trois premieres valeurs?
je pense que la réponse nous permettra de déterminer si le problème est dans le FROM ou bien avec les trois derniers counts.
Commenter la réponse de yg_be
jordane45 21448 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 24 juin 2018 Dernière intervention - 21 févr. 2018 à 09:55
0
Merci
Bonjour,


Déjà... que font ces guillemets autour du nom de tes tables / champs dans ta requête ?
Soit tu n'en met pas (et c'est très bien comme ça....) soit tu utilises des "back-quotes" => `comme_ca`

Ensuite.. au lieu de repeter le "nom des tables" ... il existe un truc super pratique.... les ALIAS.

Par exemple :
SELECT  T.champ1, T.champ2
FROM matable T
...


A utiliser sans modération.... (sauf pour les requêtes DELETE pour lesquelles ça ne fonctionne pas)


jordane45 21448 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 24 juin 2018 Dernière intervention - 21 févr. 2018 à 09:57
NB : Pour poster du code sur le forum.. merci d'utiliser la coloration syntaxique (les balises de code).
Explications disponibles ici : http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
Commenter la réponse de jordane45
Reivax962 3238 Messages postés jeudi 16 juin 2005Date d'inscription 22 juin 2018 Dernière intervention - 26 févr. 2018 à 10:33
0
Merci
Bonjour,

De quel type est Bledatl ?
Est-ce vraiment juste la date, ou contient-il l'heure ? Cela expliquerait que des valeurs apparemment identiques ne le soient, en fait, pas.

Xavier
Commenter la réponse de Reivax962