sql >> Database >  >> RDS >> Mysql

Kruistabelweergave in mySQL?

Dit type gegevenstransformatie wordt een PIVOT genoemd. MySQL heeft geen spilfunctie, maar u kunt een aggregatiefunctie gebruiken met een CASE expressie om het resultaat te krijgen.

Als de namen van de clients van tevoren bekend is, kunt u de vraag hard coderen:

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;

Zie SQL Fiddle met demo .

Als u een onbekend aantal clients heeft of als u nieuwe clients toevoegt die u wilt opnemen zonder de code te hoeven wijzigen, kunt u een voorbereide instructie gebruiken om dynamische SQL te genereren:

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;

Zie SQL Fiddle met demo . Beide zoekopdrachten geven hetzelfde resultaat.



  1. Slaapstand - unieke kolombeperking wordt genegeerd

  2. Hoe DAYOFYEAR() werkt in MariaDB

  3. hoe een .sql-script op Heroku uit te voeren?

  4. Meerdere databases tegelijk opvragen