Você precisa dinamizar a tabela, mas o mysql não possui essa funcionalidade de pivô
então precisamos replicar sua funcionalidade
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
Existem 2 abordagens para resolver o seu problema1. crie um caso para cada ano, o que não é possível no seu caso, pois estamos lidando com o ano2. gere a consulta dinamicamente para obtermos as colunas adequadas conforme sua necessidade.
Eu dei a solução de acordo com a segunda solução onde estou gerando a consulta e armazenando-a em
@sql
variável. No violino eu imprimi o conteúdo de @sql
antes de executá-lo. 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 mais informações sobre
group_concat()
acesse o linkGROUP_CONCAT
e VARIÁVEL DEFINIDA PELO USUÁRIO
Espero que isto ajude..