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

时间:2019-01-19 09:14:18

标签: mysql sql

我正在研究一个项目,它变得比我能够处理的要复杂一些。我有一段内部连接到多个表的SQL。这些表之一返回每个人的通信方式(例如,电话号码,无线电呼叫标志,寻呼机)。

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

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

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

如何将这些结果合并为一行(不包括“空”结果)?

1 个答案:

答案 0 :(得分:0)

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

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(),以防万一某人具有多种相同类型的通信方式。