Mysql
 sql >> Base de données >  >> RDS >> Mysql

Créer une vue récapitulative dans MySQL en faisant pivoter une ligne en un nombre dynamique de colonnes

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