【问题标题】:mysql combine rows into columnsmysql 将行组合成列
【发布时间】:2015-07-02 23:00:21
【问题描述】:

假设我有一个包含以下信息的表格(可能有 40 多个独特的度量)

表1

id    name    state    Measure       score
1     Joe     CA       work ethic    40
1     Joe     CA       cleanliness   80
1     Joe     CA       helpfulness   70
2     John    TX       work ethic    70
2     John    TX       helpfulness   50
3     Jack    AZ       helpfulness   50

我想将每个人的度量合并到单独的列中,并使 id 在一个看起来像这样的新表中唯一:

表2

id    name    state    workEthicScore    cleanlinessScore    helpfulnessScore
1     Joe     CA       40                80                  70
2     John    TX       70                null                50
3     Jack    AZ       null              null                50

因此,理想情况下,我希望能够创建这个新表,而无需手动输入所有不同的度量。我将如何使用 Java 和 MYSQL 来解决这个问题?我不想使用 mysql group_concat,因为我想将它们作为单独的列,而不是合并到一个列中。

【问题讨论】:

  • 这个问题已经被问了 无数次 次,但您找不到 任何 个类似的问题吗?尝试在搜索中包含“pivot”一词。
  • 除此之外,您可能会更好地使用视图,以便它本质上是一个保存的查询,每次都会为您提供所需的结果
  • 我会尝试使用数据透视表,这里有一个很好的例子。 stackoverflow.com/questions/7674786/mysql-pivot-table
  • mesaure 列最多可以有三个不同的值或多个值?。

标签: java mysql


【解决方案1】:

像这样开始构建您的查询:

  SELECT t.id
       , t.name 
       , t.state
       , 0           AS workEthicScore
       , 0           AS cleanlinessScore
       , 0           AS helpfulnessScore
    FROM mytable t
   GROUP
      BY t.id
       , t.name 
       , t.state

要返回 score 的值,您可以使用执行条件聚合的表达式,并将上述语句中的文字 0 替换为如下表达式:

       , MAX(IF(t.measure = 'work ethic', t.score,NULL)) AS workEthicScore

measure 的其他值重复相同的模式。

要使这样的查询正常工作,列数、列名以及用于返回列值的表达式必须在 SQL 语句中指定。这不能在语句中动态完成。

要动态获得这样的结果需要两个单独的语句。第二条语句必须采用如上所示的形式。您可以使用单独的语句来获取一些值来帮助您构建该语句,例如

  SELECT m.measure FROM mytable m GROUP BY m.measure 

或者,您可以做一些更有趣的事情,生成表达式和别名以包含在第二个语句的 SELECT 列表中:

  SELECT CONCAT('      , MAX(IF(t.measure='''
           ,REPLACE(m.measure,'''','''''')
           ,''',t.score,NULL) AS `'
           ,m.measure
           ,'`'
         ) AS expr
    FROM mytable m
   GROUP BY m.measure

不可能在单个语句中使用动态列获得这样的结果。

【讨论】:

    【解决方案2】:

    这里是查询-

    mysql> select id, 
                  name, 
                  state, 
                  max(if(measure='work ethic', score, null)) as `work ethic`, 
                  max(if(measure='cleanliness',score, null)) cleanliness,        
                  max(if(measure='helpfullness',score, null)) helpfullness 
            from tt 
            group by id;
    +------+------+-------+------------+-------------+--------------+
    | id   | name | state | work ethic | cleanliness | helpfullness |
    +------+------+-------+------------+-------------+--------------+
    |    1 | Joe  | CA    |         40 |          80 |           70 |
    |    2 | Jhon | TX    |         70 |        NULL |           50 |
    |    3 | Jack | AZ    |       NULL |        NULL |           50 |
    +------+------+-------+------------+-------------+--------------+
    3 rows in set (0.00 sec)
    

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2020-06-14
      相关资源
      最近更新 更多