sql >> Base de Datos >  >> RDS >> Mysql

Cree una vista de resumen en MySQL girando la fila en un número dinámico de columnas

Necesita pivotar la tabla, pero mysql no tiene ninguna funcionalidad de pivote

entonces necesitamos replicar su funcionalidad

EDITADO

Select 
  group_concat(
    DISTINCT 
       if(year is null,
          CONCAT('max(if (year is null, state, 0)) as ''NULL'' '),
          CONCAT('max(if (year=''', year, ''', state, 0)) as ''',year, ''' '))
    ) into @sql from tbl join (SELECT @sql:='')a;
set @sql = concat('select company_name, ', @sql, 'from tbl group by company_name;');
PREPARE stmt FROM @sql;
EXECUTE stmt;

Resultado

| COMPANY_NAME | 2008 | 2009 | 2010 | NULL |
--------------------------------------------
|     companyA |    1 |    0 |    0 |    0 |
|     companyB |    0 |    2 |    0 |    0 |
|     companyC |    0 |    0 |    3 |    3 |

SQL FIDDLE

Hay 2 enfoques para resolver su problema1. cree un caso para cada año, lo que no es posible en su caso, ya que estamos tratando con el año 2. genere la consulta dinámicamente para que obtengamos las columnas adecuadas según sus necesidades.

He dado una solución de acuerdo con la segunda solución donde estoy generando la consulta y almacenándola en @sql variable. En el violín he impreso el contenido de @sql antes de ejecutarlo.

select company_name, max(if (year='2008', state, 0)) as '2008' ,max(if (year='2009', state, 0)) as '2009' ,max(if (year='2010', state, 0)) as '2010' ,max(if (year is null, state, 0)) as 'NULL' from tbl group by company_name; 

Para obtener más información sobre group_concat() vaya a través del enlace ">GROUP_CONCAT y VARIABLE DEFINIDA POR EL USUARIO

Espero que esto ayude..