Grouper en fonction d'une partie de champ datetime

Grouper en fonction d'une partie de champ datetime - SQL/NoSQL - Programmation

Marsh Posté le 14-08-2007 à 12:22:52    

Bonjour,
 
je cherche à extraire d'une table le nombre de parties jouées par jour. Voici ma requête qui ne marche pas. Les jours sont mentionnés dans le champ datetime :
 

Code :
  1. SELECT COUNT( * ) AS `parties`
  2. FROM score
  3. GROUP BY substring(datetime(19),9,2)


 
 
Savez-vous ce que je dois y changer ?
Merci

Reply

Marsh Posté le 14-08-2007 à 12:22:52   

Reply

Marsh Posté le 14-08-2007 à 12:31:33    

J'ai aussi essayé ça sans succès :
 
SELECT COUNT( * ) AS `parties`
FROM score
GROUP BY DISTINCT `moment` AS substring( datetime( 19 ) , 9, 2 )

Reply

Marsh Posté le 14-08-2007 à 13:01:41    

essaie ça pour voir
 
SELECT COUNT( * ) AS `parties`, substring( datetime( 19 ) , 9, 2 ) AS `moment`
FROM score
GROUP BY DISTINCT `moment`
 
et tu devrais remplacer * par un champ précis


---------------
The Rom's, à votre service
Reply

Marsh Posté le 14-08-2007 à 13:07:41    

en oracle ce serait
 

Code :
  1. select trunc(datetime) jour,count(*) nbr_parties
  2. from score
  3. group by trunc(datetime)


 
cherche la fonction de ton sgbd qui tronque le jour

Reply

Marsh Posté le 14-08-2007 à 14:14:03    

Avant d'essayer une autre question, comme c'est une table qui est en prod et utilisée, on est d'accord que les requêtes que vous m'avez données ne vont pas modifier le contenu des champs datetime ?

Reply

Marsh Posté le 14-08-2007 à 14:20:02    

un SELECT ne fait que lire

Reply

Marsh Posté le 16-08-2007 à 09:51:18    

TheRom_S a écrit :

essaie ça pour voir
 
SELECT COUNT( * ) AS `parties`, substring( datetime( 19 ) , 9, 2 ) AS `moment`
FROM score
GROUP BY DISTINCT `moment`
 
et tu devrais remplacer * par un champ précis


Dans le cas du COUNT(), c'est la seule exception où * ne pose pas de problème : cela indique au SGBD de ne faire de distinct sur aucun tuple.
On peut spécifier le champ de clé primaire à la place si on veut, mais lorsque la clé est composite, on perd en lisibilité :
 
Exemple :
J'ai une table produit (fam_id, pro_id, typpro, nompro) donc la clé primaire est (fam_id, pro_id).
Je veux le nombre de produits groupés par typpro :

Code :
  1. SELECT COUNT(fam_id) cpt, typpro
  2. FROM pro
  3. GROUP BY typpro


 
A première lecture, le dev qui passe derrière peut penser qu'on compte non pas le nombre de produits groupés par typpro, mais le nombre de fam_id différents par typpro. Mettre un "*" dans ce cas, permet au premier coup d'oeil d'isoler qu'on compte bien tout.

Reply

Marsh Posté le 16-08-2007 à 14:47:50    

Bonjour
J'ai modifié en mettant cette requête mais ça coince toujours :
 
SELECT COUNT( `date_played` ) AS `parties`, substring( `date_played`( 19 ) , 1, 10 ) AS `moment`
FROM score
GROUP BY DISTINCT `moment`
 
parce qu en fait mon champ DATE_PLAYED est celui qui contient l'heure. Voici la composition de la table SCORE car je crois m'être embrouillé dans ma demande :
 
  `id_score` int(11) NOT NULL auto_increment,
  `id_game` int(11) NOT NULL default '0',
  `id_user` int(11) NOT NULL default '0',
  `points` int(11) NOT NULL default '0',
  `time` int(10) unsigned NOT NULL default '0' ,
  `time_formated` varchar(100) NOT NULL default '0',
  `date_played` datetime NOT NULL default '0000-00-00 00:00:00' ,
  `id_week` tinyint(1) NOT NULL default '0',
 

Reply

Marsh Posté le 16-08-2007 à 15:01:03    

group by :
- ne peut pas porter sur un alias
- distinct ? connait pas, ça fait déjà un distinct :heink:

Reply

Marsh Posté le 16-08-2007 à 15:02:49    

SELECT COUNT(*) parties, substring(date_played, 1, 10 ) moment  
FROM score  
GROUP BY substring(date_played, 1, 10 )
 
Si ça marche pas, repose ta question, ou change de SGBD, parceque soit c'est ton cerveau qui fuit, soit c'est MySQL qui est une sous-merde.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed