Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erstellen Sie eine Zusammenfassungsansicht in MySQL, indem Sie die Zeile in eine dynamische Anzahl von Spalten umwandeln

Sie müssen die Tabelle pivotieren, aber mysql hat keine solche Funktion von pivot

also müssen wir seine Funktionalität replizieren

BEARBEITET

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;

Ergebnis

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

SQL-FIDDLE

Es gibt 2 Ansätze zur Lösung Ihres Problems1. Fall für jedes Jahr erstellen, was in Ihrem Fall nicht möglich ist, da wir es mit Jahr2 zu tun haben. Generieren Sie die Abfrage dynamisch, damit wir die richtigen Spalten gemäß Ihren Anforderungen erhalten.

Ich habe eine Lösung gemäß der zweiten Lösung angegeben, bei der ich die Abfrage erzeuge und in @sql speichere Variable. In der Geige habe ich den Inhalt von @sql gedruckt vor der Ausführung.

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; 

Weitere Informationen zu group_concat() Gehen Sie über den Link GROUP_CONCAT und BENUTZERDEFINIERTE VARIABLE

Hoffe das hilft..