我正在研究一个项目,它变得比我能够处理的要复杂一些。我有一段内部连接到多个表的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
然后对每个人重复上述操作,尽管每行重复,其他字段也会正确显示。
如何将这些结果合并为一行(不包括“空”结果)?
答案 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()
,以防万一某人具有多种相同类型的通信方式。