Java mysql将行合并为列

Java mysql将行合并为列,java,mysql,Java,Mysql,假设我有一个包含以下信息的表(可能有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 T

假设我有一个包含以下信息的表(可能有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,因为我希望将它们作为单独的列,而不是组合成单个列。

开始像这样构建查询:

  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
       , MAX(IF(t.measure = 'work ethic', t.score,NULL)) AS workEthicScore
要获取返回的
score
值,可以使用执行条件聚合的表达式,并将上面语句中的文本
0
替换为如下表达式:

  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
       , 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
不可能在一条语句中通过动态列获得这样的结果。

下面是查询-

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)

这个问题已经被问了很多次了,你找不到类似的问题吗?尝试在搜索中包含“pivot”一词。除此之外,您最好使用一个视图,以便它本质上是一个已保存的查询,每次我尝试pivot表时,它都会为您提供所需的结果,这里有一个很好的示例。mesaure列最多可以有三个不同的值或多个值?。