我想使用 MySQL 数据库存储不同“ channel ”的每日测量值:
date | channel | value
-----+---------+------
1.1. | 'A' | 1
1.1. | 'B' | 2
1.1. | 'C' | 3
2.1. | 'A' | 4
2.1. | 'C' | 5
3.1. | 'A' | 6
3.1. | 'B' | 7
3.1. | 'C' | 8
4.1. | 'A' | 9
4.1. | 'B' | 10
4.1. | 'C' | 11
每天都会插入当时可用的 channel (在上表中, channel “B”在 2.1 上不可用)。每天每个 channel 的测量不会超过一次,即 (date,channel)
始终是唯一的。
我的问题:
在一个表中检索该数据的 SQL 命令是什么,即结果如下:
date | A | B | C
-----+----+----+---
1.1. | 1 | 2 | 3
2.1. | 4 | - | 5
3.1. | 6 | 7 | 8
4.1. | 9 | 10 | 11
可选任务: channel 只是 channel ID,不同的表将 ID 映射到 channel 名称。
(实际上我认为这太微不足道了,到处都有关于它的例子。但是要么我的搜索引擎坏了,要么我想在这里做一些奇怪的事情......)
备注:SQL Cross Tab Function没有解决这个问题,因为我需要将结果放在单独的列中,而不是汇总到一个列中。
最佳答案
根据你的例子,你可以试试这个方法
SELECT `date`,
SUM(CASE WHEN channel_id = 'A' THEN `value` END) 'A',
SUM(CASE WHEN channel_id = 'B' THEN `value` END) 'B',
SUM(CASE WHEN channel_id = 'C' THEN `value` END) 'C'
FROM t
GROUP BY `date`
ORDER BY `date`
结果
date A B C
1.1. 1 2 3
2.1. 4 (null) 5
3.1. 6 7 8
4.1. 9 10 11
关于mysql - SQL:在一个表中返回多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46287662/