Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pernyataan SQL - Matriks SQL

Ada dua cara untuk memutar datanya di MySQL. Jika Anda mengetahui nilainya sebelumnya (tim) maka Anda akan membuat hard-code nilainya atau Anda dapat menggunakan pernyataan yang disiapkan untuk menghasilkan sql dinamis.

Versi statis adalah:

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;

Lihat SQL Fiddle dengan Demo

Jika Anda ingin menggunakan versi dinamis dengan pernyataan yang telah disiapkan, kodenya adalah:

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;

Lihat SQL Fiddle dengan Demo .

Sunting #1, setelah memikirkan ini, saya sebenarnya akan melakukan ini sedikit berbeda. Saya akan menghasilkan matriks yang benar dari data tempat tim muncul di baris dan kolom. Untuk melakukan ini, pertama-tama Anda akan menggunakan UNION ALL kueri untuk mendapatkan semua tim dalam dua kolom:

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

Lihat SQL Fiddle dengan Demo . Setelah selesai, Anda akan memutar datanya:

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;

Lihat SQL Fiddle dengan Demo . Yang memberikan hasil yang lebih detail dari:

| 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. Saat Penyelesaian Kursus, perbarui basis data eksternal

  2. Kolom peningkatan otomatis MySQL melonjak 10- mengapa?

  3. Panduan menggunakan Sphinx dengan PHP dan MySQL

  4. Rata-rata bergerak - MySQL

  5. MySQL Penjualan bulanan 12 bulan terakhir termasuk bulan tanpa Penjualan