Không phải là không thể, chỉ phức tạp. Bạn có thể sử dụng STR_TO_DATE
để chuyển đổi các chuỗi của bạn thành DATETIME
đối tượng, từ đó bạn có thể sử dụng MONTH
để lấy số tháng. Tuy nhiên, lưu ý (như @DRapp đã nhận xét) rằng bạn nên lưu trữ DATETIME
các giá trị ở dạng gốc của chúng, không phải là VARCHAR
, thì bạn sẽ không phải đối phó với STR_TO_DATE
. Sau khi có số tháng, bạn có thể sử dụng tính năng tổng hợp có điều kiện để nhận được kết quả bạn muốn:
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
Đầu ra (cho dữ liệu mẫu của bạn):
name Jan Feb Mar Apr Dec AVG
Chris 0 4 0 2 0 3
John 0 0 0 2.6667 0 2.6667