Regrouper les resultat d'une requete sql [Résolu/Fermé]

Signaler
Messages postés
39
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
3 octobre 2014
-
juliusescalibus
Messages postés
39
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
3 octobre 2014
-
bonjour,

voici ma requete actuelle :

Select FinDevis.do_piece, FinDevis.do_client, FinDevis.DO_NomCli,COUNT (distinct FinDevis.do_piece) as nbdev

From FinDevis, FinLigDevis

Where findevis.DO_Date between '01/1/2013' and '29/01/2014'

and FinDevis.DO_Piece=FinLigDevis.DO_Piece

Group by FinDevis.do_piece, FinDevis.do_client, FinDevis.DO_NomCli

order by DO_NomCli

et voici le resultat :

do_piece do_client DO_NomCli nbdev
DE132474 PROSPECT ACHACHE 1
DE132738 PROSPECT CROIX DES VENTS 1
DE132739 PROSPECT CROIX DES VENTS 1
DE132740 PROSPECT CROIX DES VENTS 1
DE132743 PROSPECT CROIX DES VENTS 1
DE123295 PROSPECT A VOUS DE JOUER 1
DE130280 PROSPECT A.2T.M 1
DE132455 PROSPECT A.S.P 1
DE131342 413991 A2F MENUISERIE 1
DE131362 413991 A2F MENUISERIE 1
DE130650 413991 A2F MENUISERIE 1
DE123591 413991 A2F MENUISERIE 1
DE123814 413991 A2F MENUISERIE 1

j'aimerais regrouper par les lignes concernant le meme client en une seule .soit ceci:

DE132474 PROSPECT ACHACHE 1
DE132738 PROSPECT CROIX DES VENTS 4
DE123295 PROSPECT A VOUS DE JOUER 1
DE130280 PROSPECT A.2T.M 1
DE132455 PROSPECT A.S.P 1
DE131342 413991 A2F MENUISERIE 5

merci d'avance pour votre aide

4 réponses

Messages postés
275
Date d'inscription
lundi 27 janvier 2014
Statut
Membre
Dernière intervention
25 avril 2019
14
Le distinct que tu utilise dans la requête , c'est ça le "secret" mais je ne sait plus exactement pourquoi , mais la ta requête avec le distinct ne semble pas marché

car le distinct fait que , quand il a trouvé un résultat , il vas ignoré les autres , c'est bizarre qu'il te sorte plusieurs fois le même client
Killburns911
Messages postés
275
Date d'inscription
lundi 27 janvier 2014
Statut
Membre
Dernière intervention
25 avril 2019
14
Okay , j'ai rien dit , regarde ce que j'ai ecris :P

ton distinct est mal placé en fait , cela ressemblerais plus a ceci

Select FinDevis.do_piece, FinDevis.do_client, (distinct FinDevis.DO_NomCli),COUNT FinDevis.do_piece as nbdev
juliusescalibus
Messages postés
39
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
3 octobre 2014

cela ne marche pas car le logiciel utilisant cette base creer dans celle ci une nouvelle ligne à chaque modif de faite sur le devis (ex de132738) .( le tous affecter au meme do_piece = DE132738)
mon distinct est donc là pour ne prendre qu'un resultat et donc qu'un do_piece .
mais je voudrais regrouper sur une ligne clients le nombre de devis trouver
Killburns911
Messages postés
275
Date d'inscription
lundi 27 janvier 2014
Statut
Membre
Dernière intervention
25 avril 2019
14
c'est une question que j'aurais du poser depuis le depart , quel est le SGDBR que tu utilise ?
est-ce une base local ? base distante ?
Messages postés
39
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
3 octobre 2014

j'utilise sql server management . sur une base presente sur un server local.
c'est moi qui auris dû le preciser...
Killburns911
Messages postés
275
Date d'inscription
lundi 27 janvier 2014
Statut
Membre
Dernière intervention
25 avril 2019
14
dans ce cas , si tu met les deux distinct , comme tu l'avais écris au départ , et comme j'ai écris le mien , ca ne marche pas ?

je suis au travail , je n'ai pas l'opportunité de t'aidez plus que ca :/
Messages postés
3571
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
20 février 2020
933
Bonjour,

Quel do_piece doit-on récupérer ? Le plus petit ?
Dans ce cas, essaie cette requête :

SELECT MIN(FinDevis.do_piece), FinDevis.do_client, FinDevis.DO_NomCli, COUNT (*) as nbdev
FROM FinDevis, FinLigDevis
WHERE findevis.DO_Date BETWEEN '01/1/2013' AND '29/01/2014'
    AND FinDevis.DO_Piece = FinLigDevis.DO_Piece
GROUP BY FinDevis.do_client, FinDevis.DO_NomCli
ORDER BY DO_NomCli 


Xavier
Messages postés
39
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
3 octobre 2014

merci pour ta reponse Reivax962 ...

çà semble donner ce qu'il me faut ...
j'aurais 2 questions cela dit : que fait MIN(FinDevis.do_piece) ?
a quoi sert count(*) ?
car lorsque je l'utilise comme çà cela me donne un resultat different de ce que j'attends , par contre j'obtient bien ce que je veux avec COUNT (distinct FinDevis.do_piece).

MERCI ENCORE
juliusescalibus
Messages postés
39
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
3 octobre 2014

SELECT max (FinDevis.do_piece) ou SELECT min (FinDevis.do_piece).
cela ne change pas mon resultat de requete...
Reivax962
Messages postés
3571
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
20 février 2020
933
Cela devrait changer le do_piece renvoyé.

En fait, dans le GROUP BY que tu proposais, tu intégrais do_piece. Comme ceux-ci sont différents, SQL Server ne les regroupe pas en une seule ligne.
Il faut donc supprimer do_piece de ton GROUP BY, ce que j'ai fait.
Mais comme tu voulais quand même cette information, il fallait en choisir un parmi ceux qui existent. MIN pour prendre le plus petit, MAX pour prendre le plus grand.

Le count(*), c'est pour compter le nombre de lignes qui contiennent les mêmes do_client et do_nomcli, sans restriction.
Avec COUNT(distinct FinDevis.do_piece), tu comptes le nombre de do_pieces différents parmi les lignes qui ont les mêmes do_client et do_nomcli.
Ils sont équivalents si chaque ligne a un do_piece différent, mais si tu as des doublons de do_pieces leur valeur sera différente. À toi de choisir celui qui te convient.

Xavier
juliusescalibus
Messages postés
39
Date d'inscription
jeudi 9 janvier 2014
Statut
Membre
Dernière intervention
3 octobre 2014

merci à vous pour votre aide ...
je m'en suis sortie !!!