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

Chế độ xem Crosstab trong mySQL?

Kiểu chuyển đổi dữ liệu này được gọi là PIVOT. MySQL không có hàm pivot nhưng bạn có thể sử dụng hàm tổng hợp với CASE biểu thức để nhận kết quả.

Nếu tên của clients được biết trước, sau đó bạn có thể viết mã cố định cho truy vấn:

select s.playdate,
  sum(case when clname = 'Chris' then score end) Chris,
  sum(case when clname = 'Gale' then score end) Gale,
  sum(case when clname = 'Donna' then score end) Donna
from clients c
inner join scores s
  on c.clid = s.clid
group by s.playdate;

Xem SQL Fiddle với Demo .

Nếu bạn có một số lượng khách hàng không xác định hoặc bạn sẽ thêm các ứng dụng khách mới mà bạn muốn đưa vào mà không cần phải thay đổi mã, thì bạn có thể sử dụng một câu lệnh đã chuẩn bị để tạo SQL động:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(CASE WHEN clName = ''',
      clName,
      ''' THEN score else ''-'' END) AS `',
      clName, '`'
    )
  ) INTO @sql
FROM clients;

SET @sql 
  = CONCAT('SELECT s.playdate, ', @sql, ' 
            from clients c
            inner join scores s
              on c.clid = s.clid
            group by s.playdate');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Xem SQL Fiddle với Demo . Cả hai truy vấn sẽ cho cùng một kết quả.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Codeigniter db-> update () VS CẬP NHẬT gốc của MySQL Các hàng bị ảnh hưởng:0

  2. Hiển thị tất cả các bảng bên trong cơ sở dữ liệu MySQL bằng PHP?

  3. Sử dụng SQL LIKE và IN cùng nhau

  4. Sự khác biệt giữa việc sử dụng TÀI LIỆU THAM KHẢO có và không có KEY NGOẠI HỐI?

  5. Laravel 5.3:Lỗi cú pháp hoặc vi phạm quyền truy cập:1463 Trường không nhóm 'khoảng cách' được sử dụng trong mệnh đề HAVING