假设我有一个包含以下信息的表(可能有40+唯一的度量)
table1
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
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,因为我希望将它们作为单独的列,而不是合并成一个列。
发布于 2015-07-02 23:11:50
开始构建这样的查询:
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不可能在一个语句中用动态列获得这样的结果。
发布于 2015-07-03 04:36:50
这是查询-
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)https://stackoverflow.com/questions/31195966
复制相似问题