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

Widok tabeli krzyżowej w MySQL?

Ten rodzaj transformacji danych nazywa się PIVOT. MySQL nie ma funkcji przestawnej, ale możesz użyć funkcji agregującej z CASE wyrażenie, aby uzyskać wynik.

Jeśli nazwy clients jest znane z wyprzedzeniem, możesz zakodować zapytanie:

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;

Zobacz Skrzypce SQL z wersją demonstracyjną .

Jeśli masz nieznaną liczbę klientów lub będziesz dodawać nowych klientów, których chcesz dołączyć bez konieczności zmiany kodu, możesz użyć przygotowanej instrukcji do wygenerowania dynamicznego SQL:

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;

Zobacz SQL Fiddle z wersją demonstracyjną . Oba zapytania dadzą ten sam wynik.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja MySQL ABS() – zwraca wartość bezwzględną liczby

  2. mysql pasuje do wielu słów

  3. PyMySQL zwraca stare/migawkowe wartości/nie uruchamia ponownie zapytania?

  4. Tworzenie widoku MySQL z automatycznie zwiększającą się kolumną identyfikatora

  5. Operatory logiczne MySQL