mysql - SQL:在一个表中返回多对多

标签 mysql sql database

我想使用 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/

相关文章:

java - Hibernate 尝试向不存在的表插入数据

c# - SQL Server 中的错误处理问题

java - Java中如何给带有in关键字的MySQL语句赋值?

MySQL - 通过分区和索引加载数据

mysql - 'LIMIT'参数在sql中是如何工作的?

mysql - MySQl 查询中的一个愚蠢错误

php - GROUP BY mysql 只显示一行。但也想要重复

java - JSON 解析问题未解决

MySQL查询结果说明

mysql - 使用 WHERE IN 子句按顺序抓取行