[SQL] Requête sur nombre d'occurrences

[Fermé]
Signaler
Messages postés
7
Date d'inscription
vendredi 15 avril 2016
Statut
Membre
Dernière intervention
12 septembre 2016
-
 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

Messages postés
33196
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
2 août 2021
3 650
Bonjour,

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


Messages postés
2231
Date d'inscription
samedi 25 octobre 2014
Statut
Membre
Dernière intervention
22 février 2020
1 880
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
Messages postés
33196
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
2 août 2021
3 650
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. ..
Messages postés
33196
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
2 août 2021
3 650 >
Messages postés
33196
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
2 août 2021

Messages postés
7
Date d'inscription
vendredi 15 avril 2016
Statut
Membre
Dernière intervention
12 septembre 2016

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
Messages postés
33196
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
2 août 2021
3 650
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
 
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 ....