如何编写 MySQL 动态枢轴 table?

How can I write a MySQL dynamic pivot table?

我无法理解 MySQL 中的这个支点 table。

SQL 调用看起来像:

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

table 看起来像这样:

    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

请注意,我需要按年份 DESC LIMIT 7 进行排序。我拥有的最新数据是 2014 年的数据。

这就是我要找的:

    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

这个SQL只给了我一种类型,它不是动态的:

    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

我怎样才能列出所有类型,并且是动态的?

感谢任何帮助

您可以使用 GROUP_CONCAT 到 return 逗号分隔列表,然后在代码中处理它。

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