sql >> Database teknologi >  >> RDS >> Mysql

Krydstabuleringsvisning i mySQL?

Denne type datatransformation kaldes en PIVOT. MySQL har ikke en pivotfunktion, men du kan bruge en aggregeret funktion med en CASE udtryk for at få resultatet.

Hvis navnene på clients er kendt i forvejen, så kan du hardkode forespørgslen:

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 Fiddle with Demo .

Hvis du har et ukendt antal klienter, eller du vil tilføje nye klienter, som du vil have inkluderet uden at skulle ændre koden, så kan du bruge en forberedt sætning til at generere 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 Fiddle with Demo . Begge forespørgsler vil give det samme resultat.



  1. Kan ikke oprette forbindelse til Oracle-databasen ved hjælp af JDBC, hvis adgangskoden har specialtegn

  2. Hvordan opretter jeg et cirkeldiagram, der viser mængden af ​​noget registreret af hver enkelt person?

  3. oracle systimestamp (sysdate) til millisekunder

  4. Hvordan dræber du alle nuværende forbindelser til en SQL Server 2005-database?