Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Crie uma visualização de resumo no MySQL dinamizando a linha em um número dinâmico de colunas


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