Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql... Requête impossible ?

Pas impossible, juste alambiqué. Vous pouvez utiliser STR_TO_DATE pour convertir vos chaînes en DATETIME objets, à partir desquels vous pouvez ensuite utiliser MONTH pour obtenir le numéro du mois. Notez cependant (comme @DRapp l'a commenté) que vous devriez stocker DATETIME les valeurs dans leur forme native, et non sous forme de VARCHAR , alors vous n'auriez pas à gérer le STR_TO_DATE . Après avoir obtenu le numéro du mois, vous pouvez ensuite utiliser l'agrégation conditionnelle pour obtenir les résultats souhaités :

SELECT name,
       COALESCE(AVG(CASE WHEN mth = 1 THEN PTS END), 0) AS Jan,
       COALESCE(AVG(CASE WHEN mth = 2 THEN PTS END), 0) AS Feb,
       COALESCE(AVG(CASE WHEN mth = 3 THEN PTS END), 0) AS Mar,
       COALESCE(AVG(CASE WHEN mth = 4 THEN PTS END), 0) AS Apr,
       -- repeat for May to November
       COALESCE(AVG(CASE WHEN mth = 12 THEN PTS END), 0) AS `Dec`,
       AVG(PTS) AS AVG
FROM (
  SELECT name, PTS AS PTS, MONTH(STR_TO_DATE(DATE, '%a %b %e %H:%i:%s %Y')) AS mth
  FROM data
) d
GROUP BY name

Sortie (pour vos exemples de données) :

name    Jan     Feb     Mar     Apr     Dec     AVG
Chris   0       4       0       2       0       3
John    0       0       0       2.6667  0       2.6667

Démo sur SQLFiddle