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..