sql >> Databasteknik >  >> RDS >> Mysql

Mysql...Omöjlig fråga?

Inte omöjligt, bara krångligt. Du kan använda STR_TO_DATE för att konvertera dina strängar till DATETIME objekt, från vilka du sedan kan använda MONTH för att få månadsnumret. Observera dock (som @DRapp kommenterade) att du bör lagra DATETIME värden i sin ursprungliga form, inte som VARCHAR , då skulle du inte behöva hantera STR_TO_DATE . Efter att ha fått månadsnumret kan du sedan använda villkorlig aggregering för att få de resultat du vill ha:

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

Utdata (för dina exempeldata):

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

Demo på SQLFiddle




  1. MySQL-serverstartfel "Servern avslutades utan att uppdatera PID-filen"

  2. Escape-värden i Mysqljs

  3. Ändra prioritet för ett konto inom en databaspostprofil (SSMS)

  4. Anslut Android till servern i gratis webbhotell