Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mysql ... Truy vấn không thể?

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

Demo trên SQLFiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hướng dẫn thiết kế cơ sở dữ liệu cho cuộc thăm dò và khảo sát trong MySQL

  2. Cách kết hợp hai truy vấn cập nhật có điều kiện khác nhau ở đâu

  3. Bản sao cục bộ của cơ sở dữ liệu RDS

  4. Múi giờ MySQL nhầm lẫn

  5. Không thể kết nối với MySQL bằng Sequelize