行到列转换

时间:2016-04-19 19:29:51

标签: mysql concat

多次加入后,我有原始结果。

+----------------------------------------------------------------------+
| Results                                                              |
+----+----------+-------------+----------+-----------+-----------------+
| id | group_id | question_id | question | answer_id | answer | input  |
+----+----------+-------------+----------+-----------+-----------------+
| 1  | 10001    | 1           | How old  | 1         | 25     | NULL   |  
| 2  | 10001    | 2           | What like| 3         | Cola   | NULL   |
| 3  | 10001    | 2           | What like| 4         | Other  | HotDog |
| 4  | 10001    | 3           | City     | 5         | NYC    | NULL   |
| 5  | 10001    | 4           | Name     | 7         | Other  | Alex   |
| 6  | 10002    | 1           | How old  | 1         | 25     | NULL   | 
| 7  | 10002    | 2           | What like| 6         | Candy  | NULL   |
| 8  | 10002    | 3           | City     | 8         | LA     | NULL   | 
| 9  | 10002    | 4           | Name     | 7         | Other  | Roman  | 
+----+----------+-------------+----------+-----------+--------+--------+

但现在我想在"一行视图" by group_id。 如:

+----+----------+-------------+----------+-----------+
| id | How Old  |  What like  | City     |  Name     |
+----+----------+-------------+----------+-----------+
| 1  | 25       | Cola,HotDog | NYC      | Alex      |
| 2  | 25       | Candy       | LA       | Roman     |  
+----+----------+-------------+----------+-----------+

我不知道正常的group_by / concat构造。我该怎么办?

1 个答案:

答案 0 :(得分:0)

SET @i := 1;
SELECT @i := @i + 1 AS `id`
, GROUP_CONCAT(CASE WHEN question = 'How old' THEN answer ELSE NULL END) AS `How Old`
, GROUP_CONCAT(CASE WHEN question = 'What like' THEN IF(answer='Other', input, answer) ELSE NULL END) AS `What like`
, ....
FROM theTable
GROUP BY group_id
;

group_concat忽略空值,只有在收到的唯一值为null时才返回null。对于CASE WHEN THEN ELSE END语句,您可以轻松使用{"其他"}中使用的IF(,,)语句。校验;但CASE更具可移植性(MS SQL Server最近才增加对这些IF的支持。)