猿问

如何在mysql中有条件地将行转换为列?请阅读正文

我有一个包含数据的表


id | customerName  | Campaign questionId | answerID | caseID | 

1  |   john        | Inbound | 1         | 2        | 1

2  |   john        | Inbound | 2         | 3        | 1 

3  |   john        | Inbound | 3         | 1        | 1

4  |   john        | Inbound | 4         | 5        | 1

5  |   john        | Inbound | 5         | 4        | 1

6  |   john        | Outbound| 6         | 7        | 1

7  |   john        | Outbound| 7         | 9        | 1

8  |   john        | Outbound| 8         | 2        | 1   

9  |   john        | Outbound| 9         | 1        | 1

10 |   john        | Outbound|10         | 4        | 1

详细信息:一个客户可以有多个案例,每个案例可以针对每个客户进行两次调查,分别是出站和入站。这些调查共有 10 个预定义问题。出站 5 个,入站 5 个。在我目前的情况下,我能够获得如上所示的数据,每个问题和答案都有 1 行。总计 = 对于有 1 个案例和 2 个活动的客户,即 10 行。我的目标是每个客户获得 2 行,每个案例。1 行用于入站,其他用于出站。我不是在为每个问题设置重复信息的行,而是为每个问题寻找列。期望的结果:


id|Name|caseId  |Campaign | Q1 | Q2 | Q3 | Q4 | Q5

1 |John|  1     |Outbound | 2  | 3  |1   | 5  | 4

2 |John|  1     |Inbound  | 7  | 9  |2   | 1  | 4   

总问题:10 个预定义问题;出站调查:5 个问题 入站调查:5 个问题


倚天杖
浏览 176回答 1
1回答

湖上湖

您可以使用条件聚集执行枢轴和分组在得到你想要的结果caseID,customerName并Campaign:SELECT customerName,       caseID,       Campaign,       MAX(CASE WHEN questionID % 5 = 1 THEN answerID END) AS Q1,       MAX(CASE WHEN questionID % 5 = 2 THEN answerID END) AS Q2,       MAX(CASE WHEN questionID % 5 = 3 THEN answerID END) AS Q3,       MAX(CASE WHEN questionID % 5 = 4 THEN answerID END) AS Q4,       MAX(CASE WHEN questionID % 5 = 0 THEN answerID END) AS Q5FROM dataGROUP BY caseID, customerName, Campaign输出:customerName    caseID  Campaign    Q1  Q2  Q3  Q4  Q5john            1       Inbound     2   3   1   5   4john            1       Outbound    7   9   2   1   4
随时随地看视频慕课网APP
我要回答