首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql将行合并成列

问mysql将行合并成列
EN

Stack Overflow用户
提问于 2015-07-02 23:00:21
回答 2查看 57关注 0票数 0

假设我有一个包含以下信息的表(可能有40+唯一的度量)

table1

代码语言:javascript
复制
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惟一化为一个新表,如下所示:

table2

代码语言:javascript
复制
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,因为我希望将它们作为单独的列,而不是合并成一个列。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-02 23:11:50

开始构建这样的查询:

代码语言:javascript
复制
  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替换为如下表达式:

代码语言:javascript
复制
       , MAX(IF(t.measure = 'work ethic', t.score,NULL)) AS workEthicScore

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

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

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

代码语言:javascript
复制
  SELECT m.measure FROM mytable m GROUP BY m.measure 

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

代码语言:javascript
复制
  SELECT CONCAT('      , MAX(IF(t.measure='''
           ,REPLACE(m.measure,'''','''''')
           ,''',t.score,NULL) AS `'
           ,m.measure
           ,'`'
         ) AS expr
    FROM mytable m
   GROUP BY m.measure

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

票数 0
EN

Stack Overflow用户

发布于 2015-07-03 04:36:50

这是查询-

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31195966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档