mysql - 转置部分 SQL 结果以合并记录

标签 mysql sql

我正在开发一个项目,它变得有点复杂,超出了我的处理能力。我有一段 SQL 内部连接到几个表。这些表之一返回每个人的通信方式(例如,电话号码、 radio 呼号、寻呼机)。

一旦我实现了这段代码,SQL(非常正确)就会为每个人返回多条记录,具体取决于他们填写的通信字段。因此,搜索我自己将返回:

Name  |  COMM_VALUE    | COMM_RID
Nick  |  07123 456789  |   5
Nick  |  0965          |   6
Nick  |  328493        |   7

我需要的是:

Name  |  Mobile        |   Radio    |  Pager
Nick  |  07123 456789  |   0965     |  328493
Bob   |  etc etc etc

这是更大表的一部分,所以我的问题是如何将这些列添加到我现有的 SQL 中,我研究了嵌套、子查询和联合,但自从我使用 SQL 以来已经是一个时代了,甚至我的基本进展也已经是测试我的能力。

我设想类似以下的内容,但不确定实现此目的所需的关键字:

Select
  PRP.FIRSTNAME + ‘ ‘ + PRP.SURNAME AS FULLNAME,
  RDP.POSTNAME,
  RRP.REMARKS,
  */ NEW COLUMNS */
      (SELECT COMM_VALUE FROM PERREC_COMMS WHERE COMM_RID = ‘6’) AS RADIO

上面的(编辑过的)代码确实产生了结果,但并不完全符合我的预期:

Name  |  RADIO
Nick  |  0965
Nick  |  null
Nick  |  null

然后对每个人重复上述操作,尽管每行都有重复,但其他字段正确显示。

如何将这些结果合并到一行(排除“空”结果)?

最佳答案

您想要旋转数据。一种方法是条件聚合。为此,我建议:

select name,
       group_concat(case when comm_rid = 5 then comm_value end) as what_5_means,
       group_concat(case when comm_rid = 6 then comm_value end) as radio,
       group_concat(case when comm_rid = 7 then comm_value end) as whateve_7_means
from . . .
group by name;

我不知道要使用什么 from 子句。

这使用 group_concat() 而不是 max(),以防万一某人拥有多种相同类型的通信方式。

关于mysql - 转置部分 SQL 结果以合并记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54265613/

相关文章:

sql - 可以接受客户端 SQL 吗?如果可以,如何验证?

sql - 如何在 Oracle SQL Developer 中使用变量?

mysql - 从转储恢复 mysql 数据库时忽略特定表的数据

MYSQL 通过 URL 选择

php - 存储和显示实时统计数据

sql - PostgreSQL : check if value is in 2 columns and remove it from one of them

sql - MySQL:在多个表上进行多列连接

mysql - 如何获取随机id

php - Web 应用程序中的数据库游标提取

mysql - MySQL中的 `COUNT(*)`和 `COUNT(date_created)`有区别吗