2016-04-11 8 views
1

Ich habe Probleme, meinen Kopf um diese Pivot-Tabelle in MySQL zu bekommen.Wie kann ich eine dynamische MySQL-Pivot-Tabelle schreiben?

Mit einem SQL-Aufruf, der wie folgt aussieht:

SELECT DISTINCT year, type1, type2, type3, type4 FROM Table_08 WHERE iso2ltr = 'CO' AND city = 'Boulder' ORDER BY year DESC LIMIT 7 

der Tisch etwas wie folgt aussieht:

year  | type1  | type2  | type3  | type4 
    ----------------------------------------------------------------------- 
    2014  | 242  |  1  | 41  | NULL 
    2013  | 218  |  0  | 38  | NULL 
    2012  | 249  |  0  | NULL  | 32 
    2011  | 275  |  2  | NULL  | 35 
    2010  | 210  |  4  | NULL  | 33 
    2009  | 245  |  5  | NULL  | 32 
    2008  | 201  |  0  | NULL  | 40 

Bitte beachten, dass ich brauche BY Jahr DESC LIMIT 7. Die neuesten Daten, die ich zu haben, um wird für 2014

Dies ist, was ich suche:

type | 2014 | 2013 | 2012 | 2011 | 2010 | 2009 | 2008 
    --------------------------------------------------------------------------------------------------------------- 
    type1 | 242 | 218 | 249 | 275 | 210  | 245 | 201 
    type2 | 1  | 0  | 0 | 2  | 4  | 5  | 0 
    type3 | 41 | 38 | NULL | NULL | NULL | NULL | NULL 
    type4 | NULL | NULL | 32 | 35  | 33  | 32  | 40 

Diese SQL gibt mir nur eine Art, und es ist nicht dynamisch:

SELECT city, 
     MAX(CASE WHEN YEAR =2014 THEN type1 END) AS '2014', 
     MAX(CASE WHEN YEAR =2013 THEN type1 END) AS '2013', 
     MAX(CASE WHEN YEAR =2012 THEN type1 END) AS '2012', 
     MAX(CASE WHEN YEAR =2011 THEN type1 END) AS '2011', 
     MAX(CASE WHEN YEAR =2010 THEN type1 END) AS '2010', 
     MAX(CASE WHEN YEAR =2009 THEN type1 END) AS '2009', 
     MAX(CASE WHEN YEAR =2008 THEN type1 END) AS '2008' 
    FROM Table_08 
    WHERE iso2ltr = 'CO' AND city = 'Boulder' 
    GROUP BY city 

Wie kann ich alle Arten aufgeführt werden, und dynamisch sein?

Jede Hilfe willkommen

+0

betrachten mit GROUP_CONCAT, es ist dynamisch und gibt eine durch Komma getrennte Liste zurück. –

Antwort

0

Sie GROUP_CONCAT verwenden könnte eine durch Kommata getrennte Liste zurückzukehren und dann damit umgehen nur in Code.

SELECT GROUP_CONCAT(IFNULL(year,"NULL")), 
     GROUP_CONCAT(IFNULL(type1,"NULL")), 
     GROUP_CONCAT(IFNULL(type2,"NULL")), 
     GROUP_CONCAT(IFNULL(type3,"NULL")), 
     GROUP_CONCAT(IFNULL(type4,"NULL")) 
FROM 
(SELECT DISTINCT year, type1, type2, type3, type4 FROM Table_08 WHERE iso2ltr = 'CO' AND city = 'Boulder' ORDER BY year DESC LIMIT 7)as T 
+0

Ehrfürchtig. Dadurch wurden im Code-Umschreiben gerade 30 SQL-Aufrufe in 3 umgewandelt. Vielen Dank. – royhink

Verwandte Themen