sql >> Databáze >  >> RDS >> Mysql

Křížové zobrazení v mySQL?

Tento typ transformace dat se nazývá PIVOT. MySQL nemá funkci pivot, ale můžete použít agregační funkci s CASE výraz k získání výsledku.

Pokud jsou jména clients je známý předem, pak můžete dotaz napevno zakódovat:

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;

Viz SQL Fiddle s ukázkou .

Pokud máte neznámý počet klientů nebo budete přidávat nové klienty, které budete chtít zahrnout, aniž byste museli měnit kód, můžete použít připravený příkaz ke generování dynamického 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;

Viz SQL Fiddle s ukázkou . Oba dotazy dají stejný výsledek.



  1. Jak vytvořit databázi mysql pomocí sequelize (nodejs)

  2. Propojit více tabulek v různých databázích? MySql

  3. Jak číst číslo verze z databázového souboru v Androidu, který je umístěn ve složce aktiv

  4. Symfony 2:INNER JOIN na nesouvisející tabulce s tvůrcem dotazů na doktríny