【问题标题】:Transpose rows to columns MySQL [duplicate]将行转置为MySQL列[重复]
【发布时间】:2017-03-23 18:13:38
【问题描述】:

我的查询提供了所有城市每月加入的员工人数。 (在 MySQL 中)

SELECT SUBSTR(`JoiningDate`,4,3) as Month,
 Location,
 Count(*) as `EmployeeCount` 
 FROM `data` 
 WHERE Location IN ('NYC','SFO','LA')   
 GROUP BY Month,Location

输出是这种格式 -

| Month|Location| Count|
-----------------------
|  Jan | NYC    |   100|
|  Jan | SFO    |   500|
|  Jan | LA     |   200|
|  Feb | NYC    |   100|
|  Feb | SFO    |   400|
|  Feb | LA     |   500|

我如何能够以某种格式转换数据,它会为每个城市生成具有每月相关计数的列?像下面这样 -

| Month|NYC |SFO | LA |
-----------------------
|  Jan |100 |500 |200 |

|  Feb |100 |400 |500 |

|  Mar |300 |300 |650 |

【问题讨论】:

    标签: mysql transpose


    【解决方案1】:

    您可以使用条件聚合:

    select SUBSTR(`JoiningDate`, 4, 3) as Month,
        sum(location = 'NYC') as `NYC`,
        sum(location = 'SFO') as `SFO`,
        sum(location = 'LA' ) as `LA`
    from `data`
    where Location in ('NYC', 'SFO', 'LA')
    group by SUBSTR(`JoiningDate`, 4, 3)
    

    它使用了在 MySQL 中 true 评估为 1 并且 false 评估为 0 的事实,您可以对它们进行求和以找到所需的计数。

    【讨论】:

    • 谢谢@GurV,不知道城市列表的情况如何?这意味着它不是一个有限列表。
    • @Chaitanya - 在这种情况下,建议在应用程序代码中处理此问题。另一种(丑陋的)方式是使用动态 SQL。
    • 是的,将逻辑推送到循环等更简单的应用程序是有意义的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多