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

Câu lệnh SQL - Ma trận SQL

Có hai cách mà bạn có thể xoay trục dữ liệu trong MySQL. Nếu bạn biết trước các giá trị (nhóm) thì bạn sẽ mã hóa các giá trị đó hoặc bạn có thể sử dụng một câu lệnh đã chuẩn bị để tạo sql động.

Phiên bản tĩnh sẽ là:

select TeamA,
  max(case when TeamB = 'A' then won - lost else 0 end) as A,
  max(case when TeamB = 'B' then won - lost else 0 end) as B,
  max(case when TeamB = 'C' then won - lost else 0 end) as C,
  max(case when TeamB = 'D' then won - lost else 0 end) as D,
  max(case when TeamB = 'E' then won - lost else 0 end) as E
from yourtable
group by TeamA;

Xem SQL Fiddle with Demo

Nếu bạn muốn sử dụng phiên bản động với câu lệnh đã soạn sẵn, mã sẽ là:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN TeamB = ''',
      TeamB,
      ''' THEN won - lost else 0 END) AS `',
      TeamB, '`'
    )
  ) INTO @sql
from
(
  select *
  from yourtable
  order by teamb
) x;

SET @sql 
  = CONCAT('SELECT TeamA, ', @sql, ' 
           from yourtable
           group by TeamA');

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

Xem SQL Fiddle with Demo .

Chỉnh sửa # 1, sau khi nghĩ về điều này, tôi thực sự sẽ làm điều này hơi khác một chút. Tôi sẽ tạo một ma trận thực hệ điều hành dữ liệu nơi các nhóm xuất hiện trong cả hàng và cột. Để thực hiện việc này, trước tiên bạn phải sử dụng UNION ALL truy vấn để nhận tất cả các nhóm trong hai cột:

select teama Team1, teamb Team2,
  won-lost Total
from yourtable
union all
select teamb, teama,
  won-lost
from yourtable

Xem SQL Fiddle with Demo . Sau khi hoàn tất, bạn sẽ xoay dữ liệu:

select Team1,
  coalesce(max(case when Team2 = 'A' then Total end), 0) as A,
  coalesce(max(case when Team2 = 'B' then Total end), 0) as B,
  coalesce(max(case when Team2 = 'C' then Total end), 0) as C,
  coalesce(max(case when Team2 = 'D' then Total end), 0) as D,
  coalesce(max(case when Team2 = 'E' then Total end), 0) as E
from
(
  select teama Team1, teamb Team2,
    won-lost Total
  from yourtable
  union all
  select teamb, teama,
    won-lost
  from yourtable
) src
group by Team1;

Xem SQL Fiddle with Demo . Kết quả chi tiết hơn về:

| TEAM1 |  A | B |  C | D | E |
-------------------------------
|     A |  0 | 2 | -2 | 8 | 0 |
|     B |  2 | 0 |  0 | 0 | 0 |
|     C | -2 | 0 |  0 | 0 | 0 |
|     D |  8 | 0 |  0 | 0 | 0 |
|     E |  0 | 0 |  0 | 0 | 0 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. đếm hồ sơ tham gia bảng câu hỏi và câu trả lời

  2. MySQL INTERVAL Mins

  3. kết nối Python 2.6.1 với MySQLdb

  4. MySQL Backup:Tôi có thể sao chép các tệp bảng MyISAM riêng lẻ sang một máy chủ khác với phiên bản MySQL khác và hệ điều hành khác không?

  5. Sắp xếp thứ tự các chữ cái không phải tiếng Anh trong MySQL