Regrouper les resultat d'une requete sql
Résolu
juliusescalibus
Messages postés
42
Statut
Membre
-
juliusescalibus Messages postés 42 Statut Membre -
juliusescalibus Messages postés 42 Statut Membre -
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
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
-
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-
-
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 -
-
-
j'utilise sql server management . sur une base presente sur un server local.
c'est moi qui auris dû le preciser... -
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 -
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-
-
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 -
-