Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Instrukcja SQL — macierz SQL

Istnieją dwa sposoby obracania dane w MySQL. Jeśli znasz wartości z wyprzedzeniem (zespoły), wtedy zakodujesz je na stałe lub możesz użyć przygotowanej instrukcji do wygenerowania dynamicznego sql.

Wersja statyczna to:

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;

Zobacz SQL Fiddle z wersją demonstracyjną

Jeśli chcesz użyć wersji dynamicznej z przygotowanym oświadczeniem, kod będzie wyglądał następująco:

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;

Zobacz SQL Fiddle z wersją demonstracyjną .

Edycja #1, po zastanowieniu się nad tym, zrobiłbym to trochę inaczej. Wygenerowałbym prawdziwą macierz danych, w których drużyny pojawiły się zarówno w rzędzie, jak iw kolumnie. Aby to zrobić, użyj najpierw UNION ALL zapytanie, aby uzyskać wszystkie zespoły w dwóch kolumnach:

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

Zobacz SQL Fiddle z wersją demonstracyjną . Gdy to zrobisz, możesz obrócić dane:

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;

Zobacz SQL Fiddle z wersją demonstracyjną . Co daje bardziej szczegółowy wynik:

| 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. Sprawdź poprawną nazwę kolumny SQL

  2. Wstaw zbiorczy MySQL przez PHP

  3. Jak uzyskać dostęp do mysql poza moim klastrem kubernetes?

  4. Przycisk radiowy nie wysyła wartości do bazy danych MySQL

  5. wskaźniki pierwotne vs wskaźniki wtórne:różnice w wynikach