sql >> Databáze >  >> RDS >> Mysql

Mysql...Nemožný dotaz?

Ne nemožné, jen zamotané. Můžete použít STR_TO_DATE převést vaše řetězce na DATETIME objekty, ze kterých pak můžete použít MONTH získat číslo měsíce. Všimněte si však (jak poznamenal @DRapp), že byste měli ukládat DATETIME hodnoty v jejich nativní podobě, nikoli jako VARCHAR , pak byste se nemuseli zabývat STR_TO_DATE . Jakmile získáte číslo měsíce, můžete použít podmíněnou agregaci k získání požadovaných výsledků:

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

Výstup (pro vaše ukázková data):

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

Ukázka na SQLFiddle




  1. Nelze odstranit nebo aktualizovat nadřazený řádek ConstraintViolationException

  2. Přehled vygenerovaných sloupců pro PostgreSQL

  3. The Secrets of Dominoes aneb A Domino Game Data Model

  4. Kombinujte pole z různých řádků za podmínky