Mysql
 sql >> база данни >  >> RDS >> Mysql

Crosstab View в mySQL?

Този тип трансформация на данни се нарича PIVOT. MySQL няма централна функция, но можете да използвате агрегатна функция с CASE израз, за ​​да получите резултата.

Ако имената на clients е известно предварително, тогава можете да кодирате заявката:

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;

Вижте SQL Fiddle с демонстрация .

Ако имате неизвестен брой клиенти или ще добавяте нови клиенти, които искате да включите, без да се налага да променяте кода, тогава можете да използвате подготвен израз за генериране на динамичен 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;

Вижте SQL Fiddle с демонстрация . И двете заявки ще дадат същия резултат.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на ЗНП в часовете

  2. utf8_bin срещу utf_unicode_ci

  3. MySQL изберете къде колоната не е празна

  4. Как да убия MySQL връзки

  5. ГРЕШКА 2003 (HY000):Не мога да се свържа с MySQL сървър на локален хост (10061)