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 23/12/2010, 10h41   #1
Invité de passage
 
Julien
Inscription : décembre 2010
Messages : 2
Détails du profil
Informations personnelles :
Nom : Julien

Informations forums :
Inscription : décembre 2010
Messages : 2
Points : 0
Points : 0
Par défaut Une requete à base de count?

Bonjour,

J'essaye de compter le nombre d'occurrences des différents statuts possibles et groupés par date.

ma table :


ce que je veux obtenir :


Qu'est ce que vous en pensez?
Nunien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 10h45   #2
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
bonjour,

Code sql :
1
2
3
 
SELECT date, `status`, COUNT(*) AS nombre FROM TABLE
GROUP BY date, `status`

PS: status est un mot clé réservé MySQL
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 11h05   #3
Invité de passage
 
Julien
Inscription : décembre 2010
Messages : 2
Détails du profil
Informations personnelles :
Nom : Julien

Informations forums :
Inscription : décembre 2010
Messages : 2
Points : 0
Points : 0
Merci pour la réponse mais ca ne permet de compter qu'un seul statut.

En fait je viens de trouver la réponse. C'est marrant : après avoir galéré plus d'une journée là dessus, il suffit que je poste mon problème pour trouver la réponse par moi même en 15 minutes :

Code :
1
2
3
4
5
6
7
8
SELECT
  LEFT(request_time, 10) AS on_date,
  ((SELECT count(job_id) AS n1 FROM TABLE WHERE STATUS='done' AND LEFT(request_time, 10) = on_date)) AS nb_done,
  ((SELECT count(job_id) AS n2 FROM TABLE WHERE STATUS='refused' AND LEFT(request_time, 10) = on_date)) AS nb_refused,
  ((SELECT count(job_id) AS n3 FROM TABLE WHERE STATUS='error' AND LEFT(request_time, 10) = on_date)) AS nb_error
FROM TABLE
GROUP BY LEFT(request_time, 10)
ORDER BY LEFT(request_time, 10) DESC
Je pensais pas qu'on pouvait faire des sous requêtes dans le select et avoir acces aux alias de la 'requete mere'. Mais j'ai essayé et ca marche!
Nunien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 11h09   #4
Membre du Club
 
Inscription : août 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 66
Points : 69
Points : 69
...Et pour arriver à la présentation souhaitée, on devrait pouvoir le faire en écrivant ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
SELECT
  date,
  SUM(IF(`status`='done',nombre,0) AS nb_done,
  SUM(IF(`status`='refused',nombre,0) AS nb_refused,
  SUM(IF(`status`='error',nombre,0) AS nb_error
FROM (
  SELECT
    date,
    `status`,
    COUNT(*) AS nombre
  FROM
    TABLE
  GROUP BY
    date,
    `status`
) AS stats
GROUP BY
  date
;
NicoD. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 11h14   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 978
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 : 10 978
Points : 18 222
Points : 18 222
Envoyer un message via MSN à CinePhil
Plutôt que des sous-requêtes, tu peux utiliser CASE, ce sera peut-être plus performant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT LEFT(request_time, 10) AS on_date,
    SUM(
        CASE
            WHEN `STATUS` = 'done' THEN 1 ELSE 0
        END
    ) AS nb_done,
    SUM(
        CASE
            WHEN `STATUS` = 'refused' THEN 1 ELSE 0
        END
    ) AS nb_refused,
    SUM(
        CASE
            WHEN STATUS = 'error' THEN 1 ELSE 0
        END
    ) AS nb_error
FROM `TABLE`
GROUP BY LEFT(request_time, 10)
ORDER BY LEFT(request_time, 10) DESC
En plus de STATUS, DATE et TABLE sont aussi des mots réservés SQL.

EDIT : CASE est normalisé SQL mais je crois que IF est réservé au langage procédural et pas avec cette syntaxe mais l'habituel IF THEN ELSE.
__________________
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 actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/12/2010, 11h38   #6
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Citation:
Envoyé par Nunien Voir le message
Merci pour la réponse mais ca ne permet de compter qu'un seul statut.

Quelqu'un peut m'expliquer pourquoi ?

Logiquement, un GROUP BY sur l'heure et les statuts devraient apporter les résultats souhaités non ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 11h53   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par Madfrix Voir le message
Quelqu'un peut m'expliquer pourquoi ?

Logiquement, un GROUP BY sur l'heure et les statuts devraient apporter les résultats souhaités non ?
oui et non :
ca ne donne pas les résultats sous la forme souhaitée, (une ligne par date, une colonne par statut) mais sous la forme "une ligne par date et statut"

D'autre part, si pour une date donnée aucune ligne ne présente un statut donné, votre requete ne ressortira pas ce couple date/statut en question, alors que les requêtes de NicoD et de Cinephil afficheront bien 0
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h26.


 
 
 
 
Partenaires

Hébergement Web