sql >> Databasteknik >  >> RDS >> Mysql

Korstabellvy i mySQL?

Denna typ av datatransformation kallas en PIVOT. MySQL har ingen pivotfunktion men du kan använda en aggregatfunktion med en CASE uttryck för att få resultatet.

Om namnen på clients är känd i förväg kan du hårdkoda frågan:

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;

Se SQL-fiol med demo .

Om du har ett okänt antal klienter eller om du kommer att lägga till nya klienter som du vill ha inkluderade utan att behöva ändra koden, kan du använda en förberedd sats för att generera dynamisk 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;

Se SQL-fiol med demo . Båda frågorna ger samma resultat.



  1. Utmaningslösningar för nummerseriegenerator – del 5

  2. Xampp MS SQL-server PHP 5.6

  3. Få resultat från mysql baserat på latitud longitud

  4. sql BESTÄLLNING EFTER flera värden i specifik ordning?