MySQL换位

时间:2018-01-04 10:58:47

标签: mysql

大家好,祝新年快乐!

我有一个像这样的Mysql表:

date | endpoint | nb200 | nb500
d1   | toto     | 11    | 12
d1   | tata     | 13    | 14
d1   | tutu     | 15    | 16
d2   | toto     | 21    | 22
d2   | tata     | 23    | 24
d2   | tutu     | 25    | 26

对于每个日期,每个端点都是唯一的,因此我有一个唯一的密钥(日期,端点)。日期列是实际日期,但是例如,d1和d2应该很棒。

现在,我想写一个选择请求,向我展示nb200结果:

date | toto | tata | tutu
d1   | 11   | 13   | 15
d2   | 21   | 23   | 25

目前,我最好的尝试是

SELECT date,
  (CASE WHEN endpoint = 'toto' THEN nb200 END) AS 'toto',
  (CASE WHEN endpoint = 'tata' THEN nb200 END) AS 'tata',
  (CASE WHEN endpoint = 'tutu' THEN nb200 END) AS 'tutu',
FROM table;

但这不太好,因为我得到以下内容:

date | toto| tata| tutu
d1   | 11  |     | 
d1   |     | 13  |
d1   |     |     | 15
d2   | 21  |     |
d2   |     | 23  | 
d2   |     |     | 25

有人知道如何做到这一点吗?

2 个答案:

答案 0 :(得分:2)

您需要执行条件聚合

SELECT `date`,
  MAX(CASE WHEN endpoint = 'toto' THEN nb200 END) AS 'toto',
  MAX(CASE WHEN endpoint = 'tata' THEN nb200 END) AS 'tata',
  MAX(CASE WHEN endpoint = 'tutu' THEN nb200 END) AS 'tutu'
FROM mytable
GROUP BY `date`

MAX用于有选择地获取endpoint值中的每一个。

Demo here

答案 1 :(得分:1)

您可以使用(假)聚合功能和分组

  SELECT date,
    min(CASE WHEN endpoint = 'toto' THEN nb200 END) AS 'toto',
    min(CASE WHEN endpoint = 'tata' THEN nb200 END) AS 'tata',
    min(CASE WHEN endpoint = 'tutu' THEN nb200 END) AS 'tutu',
  FROM table
 group by date;