Vous devez faire pivoter la table mais mysql n'a pas une telle fonctionnalité de pivot
nous devons donc répliquer sa fonctionnalité
EDITÉ
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;
Résultat
| COMPANY_NAME | 2008 | 2009 | 2010 | NULL |
--------------------------------------------
| companyA | 1 | 0 | 0 | 0 |
| companyB | 0 | 2 | 0 | 0 |
| companyC | 0 | 0 | 3 | 3 |
SQL FIDDLE
Il existe 2 approches pour résoudre votre problème1. créer un cas pour chaque année, ce qui n'est pas possible dans votre cas car nous traitons de l'année 2. générer la requête dynamiquement afin que nous obtenions les colonnes appropriées selon vos besoins.
J'ai donné la solution selon la deuxième solution où je génère la requête et la stocke dans @sql
variable. Dans le violon j'ai imprimé le contenu de @sql
avant de l'exécuter.
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;
Pour plus d'informations sur group_concat()
passez par le lienGROUP_CONCAT
etVARIABLE DÉFINIE PAR L'UTILISATEUR
J'espère que cela vous aidera..