Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/05/2011, 13h23   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2010
Messages : 30
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2010
Messages : 30
Points : 13
Points : 13
Par défaut Comment compter les lignes regroupées ?

Bonjour à tous,
Je suis en train de créer une requête pour compter les nombre de bateaux différents passent sur une voie eau.
Avec une requête j'ai les noms du bateau regrouper PAR MOIS et par voie eau, sauf je ne sais pas comment regrouper les bateaux qui sont dans le même mois?
comme dans la requête ci-dessous : je veux obtenir le résultat: 1 bateau client pour janvier,1 pour février,1 pour mars et 4 bateaux pour avril.
mon idée c'est de compter la ligne enregistrement du " MOIS", sauf que j'obtiens pas le bon résultat.

Cle VOIE_EAU MOIS ANNEE MATRICULE-DEVISE Nb_passages
ILL-2011 ILL 1 2011 NC-PAS 66
ILL-2011 ILL 2 2011 NC-PAS 201
ILL-2011 ILL 3 2011 NC-PAS 231
ILL-2011 ILL 4 2011 FRC218-WATERWRIEND 2
ILL-2011 ILL 4 2011 NC-PAS 924
ILL-2011 ILL 4 2011 AWSC-NEURIED 1
ILL-2011 ILL 4 2011 B035-EXPLORER 1

Vous avez des idées?
Merci d'avance!
giguoin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h23   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 003
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 003
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
Tu nous montres ta requête ?

Il faut utiliser COUNT et GROUP BY.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h24   #3
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
salut,

un truc dans le genre devrait le faire:
Code :
1
2
3
SELECT Cle,VOIE_EAU,ANNEE,MOIS,count(DISTINCT MATRICULE-DEVISE) FROM ta_table 
WHERE cle="ILL-2011" AND VOIE_EAU="ILL"
GROUP BY ANNEE,MOIS
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h41   #4
Candidat au titre de Membre du Club
 
Inscription : mars 2010
Messages : 30
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2010
Messages : 30
Points : 13
Points : 13
ci-joint ma requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT    CONCAT(`ECL`.`CODE_VOIE_EAU`,'-',YEAR(`RP1`.`DATE`))  AS `Cle`,
           `ECL`.`CODE_VOIE_EAU` AS `VOIE_EAU`,                             
          MONTH(`RP1`.`DATE`) AS `MOIS`,                             
 
                CONCAT(`BAT` .`MATRICULE`,'-',`BAT` .`DEVISE`) AS 'MATRICULE-DEVISE',
 
        SUM((IF(MONTH(`RP1`.`DATE`)=`MOIS`.`ID` , `RP1`.`PASSAGE`,0))) AS `Nb_passages`,
 
        SUM(IF(MONTH(`RP1`.`DATE`)<=`MOIS`.`ID`, `RP1`.`PASSAGE`,0)) AS `Cumul`    
 
FROM `RELEVE_PASSAGE` `RP1`, `VOIE_EAU` `VE`,`ECLUSE` `ECL`, `BATEAU` `BAT`, `TYPE_BATEAU` `TB`    ,`MOIS` `MOIS`    
 
WHERE
              `RP1`.`ID_ECLUSE` = `ECL`.`ID_ECLUSE` AND 
 
       `VE`.`CODE_VOIE_EAU` =`ECL`.`CODE_VOIE_EAU` AND
 
       `RP1`.`ID_BATEAU` =    BAT`.`ID_BATEAU`     AND                        
      `BAT`.`CODE_TYPE_BATEAU` = `TB`.`CODE_TYPE_BATEAU` AND                            
      `TB`.`CATEGORIE_TYPE_BATEAU` = 'P' AND                            
      `ECL`.`CODE_VOIE_EAU` IN('ILL')
 
AND    `RP1`.`DATE`>='2011-01-01'
 
GROUP BY `VE`.`CODE_VOIE_EAU`,`ECL`.`CODE_VOIE_EAU`,MONTH(`RP1`.`DATE`), `RP1`.`ID_BATEAU`                         
ORDER BY `ECL`.`CODE_VOIE_EAU`, month(`RP1`.`DATE`)
giguoin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h52   #5
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
ça correspond pas du tout à la structure que tu as montré au départ

enfin ma requête devrait t'inspirer...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h59   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2010
Messages : 30
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2010
Messages : 30
Points : 13
Points : 13
Citation:
Envoyé par ericd69 Voir le message
ça correspond pas du tout à la structure que tu as montré au départ

enfin ma requête devrait t'inspirer...
Merci à vous 2!
L'origine de ma requête est pour calculer le nombre de passage de bateau par écluse, sauf j'ai modifié en regroupant par voie eau.
Avec cette requête, j'obtiens le résultat au dessus.
giguoin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h07   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 003
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 003
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
Ouch ! Elle fait mal aux yeux ta requête !
1) Les apostrophes inversées sont inutiles, sauf pour la colonne "date" qui ne devrait pas s'appeler ainsi car c'est un mot réservé du langage SQL !
2) Depuis 1992, les jointures s'écrivent avec JOIN !
En les écrivant correctement, tu te serais rendu compte qu'il manque la condition de jointure avec la table des mois !
Je me demande d'ailleurs à quoi sert cette jointure ! Tu veux tous les mois même s'il n'y a pas de bateau ? Fais une jointure externe à partir du mois !

Je trouve aussi que tu te compliques bien la vie puisque tu sembles ne chercher que les types de bateau 'P' pour le code voie d'eau 'ILL' en 2011 !

Voici ta requête récrite correctement, avec toutefois la condition de jointure sur le mois à faire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT CONCAT(ECL.CODE_VOIE_EAU, '-', YEAR(RP1.`DATE`))  AS Cle,
    ECL.CODE_VOIE_EAU AS VOIE_EAU,                             
    MONTH(RP1.`DATE`) AS MOIS,                             
    CONCAT(BAT.MATRICULE, '-', BAT.DEVISE) AS 'MATRICULE-DEVISE',
    SUM((IF(MONTH(RP1.`DATE`) = MOIS.ID, RP1.PASSAGE, 0))) AS Nb_passages,
    SUM(IF(MONTH(RP1.`DATE`) <= MOIS.ID, RP1.PASSAGE, 0)) AS Cumul    
FROM RELEVE_PASSAGE RP1
INNER JOIN ECLUSE ECL ON RP1.ID_ECLUSE = ECL.ID_ECLUSE
    INNER JOIN VOIE_EAU VE ON VE.CODE_VOIE_EAU = ECL.CODE_VOIE_EAU
INNER JOIN BATEAU BAT ON RP1.ID_BATEAU = BAT.ID_BATEAU
    INNER JOIN TYPE_BATEAU TB ON BAT.CODE_TYPE_BATEAU = TB.CODE_TYPE_BATEAU
INNER JOIN MOIS ON -- manque condition de jointure !
WHERE TB.CATEGORIE_TYPE_BATEAU = 'P' 
    AND ECL.CODE_VOIE_EAU IN('ILL') -- équivalent à = 'ILL' !
    AND RP1.`DATE` >= '2011-01-01'
GROUP BY VE.CODE_VOIE_EAU, ECL.CODE_VOIE_EAU, MONTH(RP1.`DATE`), RP1.ID_BATEAU                         
ORDER BY ECL.CODE_VOIE_EAU, MONTH(RP1.`DATE`)
En beaucoup plus simple, pour le besoin que tu as exprimé, ça devrait donner ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT MONTH(RP1.`DATE`) AS MOIS,
    COUNT(*) AS nombre
FROM RELEVE_PASSAGE RP1
INNER JOIN ECLUSE ECL ON RP1.ID_ECLUSE = ECL.ID_ECLUSE
INNER JOIN BATEAU BAT ON RP1.ID_BATEAU = BAT.ID_BATEAU
    INNER JOIN TYPE_BATEAU TB ON BAT.CODE_TYPE_BATEAU = TB.CODE_TYPE_BATEAU
WHERE TB.CATEGORIE_TYPE_BATEAU = 'P' 
    AND ECL.CODE_VOIE_EAU = 'ILL'
    AND RP1.`DATE` >= '2011-01-01'
GROUP BY MONTH(RP1.`DATE`)
ORDER BY MONTH(RP1.`DATE`)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h27   #8
Candidat au titre de Membre du Club
 
Inscription : mars 2010
Messages : 30
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2010
Messages : 30
Points : 13
Points : 13
Citation:
Envoyé par CinePhil Voir le message
Ouch ! Elle fait mal aux yeux ta requête !
1) Les apostrophes inversées sont inutiles, sauf pour la colonne "date" qui ne devrait pas s'appeler ainsi car c'est un mot réservé du langage SQL !
2) Depuis 1992, les jointures s'écrivent avec JOIN !
En les écrivant correctement, tu te serais rendu compte qu'il manque la condition de jointure avec la table des mois !
Je me demande d'ailleurs à quoi sert cette jointure ! Tu veux tous les mois même s'il n'y a pas de bateau ? Fais une jointure externe à partir du mois !

Merci pour les conseils, je débute et je bidouille ma requête
Par contre, j'ai fait count(distinct(matricule-devise)) comme eric a conseillé, il me rend 1 bateau correspond 1 client, mais il ne cumule pas les clients par mois?
giguoin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h31   #9
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
le order by est pas vraiment nécessaire sauf à vouloir mettre un ordre autre que l'ordre par défaut quitte à simplifer encore

j'avoue que j'ai pas eu le courage de lui refaire sa requête quand j'ai vu ce qu'il a écrit...

tu es courageux

j'ai l'impression qu'en fac ça a pas changé depuis que j'y suis passé... on enseigne encore les jointures thêta bourrines et pas vraiment les formes normalisées
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h41   #10
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
tu as pas besoin de la parenthèse interne au count, distinct suivi d'un espace et de ce que tu comptes permet juste de dire que tu veux compter les éléments retourner sans prendre en compte les doublons

ma requête se basit sur ce que tu avait montré au début donc faut adapter
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 18h12   #11
Candidat au titre de Membre du Club
 
Inscription : mars 2010
Messages : 30
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2010
Messages : 30
Points : 13
Points : 13
Citation:
Envoyé par ericd69 Voir le message
tu as pas besoin de la parenthèse interne au count, distinct suivi d'un espace et de ce que tu comptes permet juste de dire que tu veux compter les éléments retourner sans prendre en compte les doublons

ma requête se basit sur ce que tu avait montré au début donc faut adapter
Je cherche toujours à regrouper les bateaux par mois, dommage on ne peut pas faire select sum(count(distinct matricule-devise)) from table ...group by mois, annee
giguoin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 18h22   #12
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
déjà file les create de tes tables et un jeu de données sous forme d'insert qu'on puisse facilement tester...

parce que là je pensais ton pb réglé avec ce qu'on avait dit entre cinephil et moi...

et là ça devient pénible de voir ce qui va pas encore...

et comme ça tu donneras aussi les résultats attendus pour le jeu de test et le format que tu veux...

__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 18h34   #13
Candidat au titre de Membre du Club
 
Inscription : mars 2010
Messages : 30
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2010
Messages : 30
Points : 13
Points : 13
Tu as raison Eric!
Demain matin
giguoin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 09h50   #14
Candidat au titre de Membre du Club
 
Inscription : mars 2010
Messages : 30
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : mars 2010
Messages : 30
Points : 13
Points : 13
En PJ, j'ai mis ma base complète + les données+requête pour générer le tableau de bord+ 1 modèle TDB(indicateur mensuel de trafics de bateau plaisance).

Dans le modèle TDB fourni, on compte uniquement les passages tout confondu, il y a 2 graphique, trafic mensuel et trafic cumulé année en cours par écluse.

En plus de trafic cumulé mensuel et maintenant je souhaite avoir le nombre exacte de différents bateaux ont passé sur une voie eau car un même bateau X peut passer 100 fois par mois(=100passages dans ancien TDB), mais ce qui m'intéresse maintenant qu'il est considérer comme 1 client et non pas 100 clients. je veux avoir la nombre de clients par mois et par voie eau.

J'espère c'est un peu plus claire mes explications
Fichiers attachés
Type de fichier : zip table_donnees.zip (413,7 Ko, 2 affichages)
giguoin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 10h13   #15
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
j'ai récupéré, je vais regarder
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h46.


 
 
 
 
Partenaires

Hébergement Web