sql >> Database >  >> RDS >> Mysql

SQL-instructie - SQL-matrix

Er zijn twee manieren waarop u kunt draaien gegevens in MySQL. Als u de waarden van tevoren kent (teams), dan zult u de waarden hardcoderen of u kunt een voorbereide instructie gebruiken om dynamische sql te genereren.

Een statische versie zou zijn:

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;

Zie SQL Fiddle met demo

Als u een dynamische versie met een voorbereide verklaring wilt gebruiken, zou de code zijn:

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;

Zie SQL Fiddle met demo .

Edit #1, na hierover nagedacht te hebben zou ik dit eigenlijk een beetje anders doen. Ik zou een echte matrix genereren van de gegevens waar de teams in zowel de rij als de kolom verschenen. Hiervoor gebruikt u eerst een UNION ALL query om alle teams in twee kolommen te krijgen:

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

Zie SQL Fiddle met demo . Als dat eenmaal gedaan is, zou je draaien de gegevens:

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;

Zie SQL Fiddle met demo . Wat een meer gedetailleerd resultaat geeft van:

| 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. Hoe DATE_ADD() werkt in MariaDB

  2. Controleer de ruimte die wordt gebruikt door een tabel in SQL Server

  3. Omgaan met innoDB-impasse

  4. Verkrijg de korte dagnaam in PostgreSQL