[SQL] Requête sur nombre d'occurrences

lkaiser Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
 lkaiser -
Bonjour à tous,

Je ne suis pas un pro du SQL (du moins pas pour le moment) alors je vous sollicite pour m'aider a résoudre un petit problème.
Voila je cherche depuis quelques heures comment faire une requête qui remonterait le enregistrements en doublon sur un champ particulier, et les trierait par nombre d’occurrences.
Typiquement sur une table contenant les lignes de factures, je souhaiterais la trier DESC par nombre de lignes appartenant à une même facture.
Heu j’espère que j'ai été assez explicite parce que ce n'est pas si évident.

Merci de vos réponses

Cordialement


5 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

Il existe des fonctions comme COUNT et GROUP BY.
Cela devrait suffire pour faire ce que tu demandes.


0
DelNC Messages postés 2234 Date d'inscription   Statut Membre Dernière intervention   2 004
 
Bonjour,

si tu crées les entrées depuis une page web, tu veux éviter les doublons en mettant une fonction.

On regarder avant d'enregistrer si un tuple existe déjà un enregistrement pour la société X pour une date donnée

function sql_facture_exists($nom_client , $date) {
//retourne true si le client existe
$query = "SELECT COUNT(*) 
               FROM factures
               WHERE nom_client='" . $nom_client . "'
               AND    date    =  '" . $date . "';";
	$result = execute_query($query);
	$row    = mysql_fetch_array($result);
	$result = ($row[0]>0);
	return $result;
}//end function


if (!sql_facture_exists($nom_client , $date)) {
echo "<h2>Facturecréé.</h2>\n";
$query = "INSERT INTO clients (id_facture, id_client, date_facture, ...) 
	VALUES (NULL , '$id_client', '$date_facture', ...) ;";
execute_query($query);
}//end if
else {
echo "<h2>Facture non créé.   </h2 \n";
echo "Facture  déjà existante pour le client: \"$nom_client\" <br/>	\n";
}//end if
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour Delnc.
Attention. .. tu utilises toujours l'ancienne extension de mysql considéré comme obsolète. ..
il serait temps de passer à mysqli ou a pdo.
de plus.. ta réponse n'a pas vraiment de rapport avec la question. .. sans parler du fait que nous ne savons pas si l'utilisateur developpe en php....
ni même quel SGBD il utilise vraiment. ..
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
En complément :
https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

et : https://www.commentcamarche.net/faq/44117-connexion-a-une-base-avec-pdo-mysqli

et enfin (si tu prends PDO) : https://www.commentcamarche.net/faq/27489-pdo-une-autre-facon-d-acceder-a-vos-bases-de-donnees
0
lkaiser Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
Merci Jordane pour les infos mais cela ne m'apporte rien de plus que ce que je connaissais déjà et avec lequel je suis toujours en galère ^^

Pour résumer, j'ai une table contenant N champs dont l'un est le numéro de contrat (NumContrat) et je souhaite trier cette table par regroupement de numéro de contrat descendant.

Les X premières lignes de la vue, après requête, correspondront au plus grand nombre de lignes pour un même numéro de contrat, les Y suivantes au deuxième plus grand nombre de lignes ... etc ... pour finir à la fin avec les singletons :

J'ai essayé ce code mais cela ne semble pas suffisant :
SELECT *
FROM MaTable
GROUP BY NumContrat
ORDER BY CONT(NumContrat)


peut être faut il imbriquer deux requête ?

Merci
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Tu peux utiliser une sous requête avec une jointure.
par exemple :
SELECT  T1.login_cnx,T1.NB, T2.*
FROM
(
 SELECT C.login_cnx,COUNT( C.login_cnx) as NB 
   FROM c_histo_login C
   GROUP BY C.login_cnx
   ORDER BY count(*) DESC
 )T1
 LEFT JOIN c_histo_login T2 ON T1.login_cnx =  T2.login_cnx
 ORDER BY  T1.NB DESC
 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lkaiser
 
merci Jordane45

je vois l'idée de la requête, je teste cela demain !
merci en tout cas, je pense pas que j'aurais pu trouver tout seul ....
0