Mysql
 sql >> Database >  >> RDS >> Mysql

Crea una vista di riepilogo in MySQL ruotando la riga in un numero dinamico di colonne

Devi ruotare la tabella ma mysql non ha tale funzionalità di pivot

quindi dobbiamo replicare la sua funzionalità

MODIFICATO

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;

Risultato

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

SQL FIDDLE

Ci sono 2 approcci per risolvere il tuo problema1. crea un caso per ogni anno, cosa che non è possibile nel tuo caso poiché abbiamo a che fare con l'anno2. genera la query in modo dinamico in modo da ottenere le colonne appropriate secondo le tue necessità.

Ho fornito una soluzione in base alla seconda soluzione in cui sto generando la query e memorizzandola in @sql variabile. Nel violino ho stampato il contenuto di @sql prima di eseguirlo.

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; 

Per ulteriori informazioni su group_concat() vai al linkGRUPPO_CONCAT eVARIABILE DEFINITA DALL'UTENTE

Spero che questo aiuti..