Sql 将几行信息转换为一行

Sql 将几行信息转换为一行,sql,teradata,Sql,Teradata,我有关于客户电子邮件地址和电话号码的信息,但数据存储在不同的表中,每个客户都有几行 我有我的主表与customerId等,我需要加入电子邮件和电话号码。为此,我有一个带有通信id的“translation”表,用于连接这些表 比如说 主表: CustomerID var1 var2 ... 123 1 7 我需要使用翻译表将主表与包含电子邮件和电话的表连接起来,如下所示 CustomerID CommID 123 780 123 781

我有关于客户电子邮件地址和电话号码的信息,但数据存储在不同的表中,每个客户都有几行

我有我的主表与customerId等,我需要加入电子邮件和电话号码。为此,我有一个带有通信id的“translation”表,用于连接这些表

比如说

主表:

 CustomerID var1 var2 ...
 123        1    7
我需要使用翻译表将主表与包含电子邮件和电话的表连接起来,如下所示

CustomerID CommID
123         780
123         781
123         782
commID email
780     a@a.com
commID phone
781     88888
CustomerID var1 var2 email    phone
123          1     7  a@a.com     88888
有邮件的桌子可能是这样的

CustomerID CommID
123         780
123         781
123         782
commID email
780     a@a.com
commID phone
781     88888
CustomerID var1 var2 email    phone
123          1     7  a@a.com     88888
有电话号码的桌子可能是这样的

CustomerID CommID
123         780
123         781
123         782
commID email
780     a@a.com
commID phone
781     88888
CustomerID var1 var2 email    phone
123          1     7  a@a.com     88888
如果我将上述三个表加入到我的主表中,我将实现以下目标:

CustomerID var1 var2    email    phone
123           1   7      a@a.com     ?
123           1   7       ?       88888
123           1   7       ?          ?
我明白为什么我会得到3行,但我想得到的是这样一行

CustomerID CommID
123         780
123         781
123         782
commID email
780     a@a.com
commID phone
781     88888
CustomerID var1 var2 email    phone
123          1     7  a@a.com     88888
多谢各位 编辑:

连接语法是

sel * from maintable 
left join Communication on maintable.CustomerID=Communication.CustomerID 
left join email on email.commID=Communication.CommID 
left join phone on phone.commID=Communication.CommID

要将多行合并为一行,您通常通过以下方式进行分组:

SELECT maintable.CustomerID, MAX(email), MAX(phone)
FROM maintable
LEFT JOIN Communication ON maintable.CustomerID=Communication.CustomerID 
LEFT JOIN email ON email.commID=Communication.CommID 
LEFT JOIN phone ON phone.commID=Communication.CommID
GROUP BY maintable.CustomerID

要将多行合并为一行,您通常通过以下方式进行分组:

SELECT maintable.CustomerID, MAX(email), MAX(phone)
FROM maintable
LEFT JOIN Communication ON maintable.CustomerID=Communication.CustomerID 
LEFT JOIN email ON email.commID=Communication.CommID 
LEFT JOIN phone ON phone.commID=Communication.CommID
GROUP BY maintable.CustomerID

您的实际连接语法是什么?你不应该得到三行,你应该加入五个表(或七个),而不是三个。对不起,我犯了一个错误。我的电子邮件和电话表中没有CustomerID。联接语法为sel*from maintable left join Communication on maintable.CustomerID=Communication.CustomerID left join email on email.commID=Communication.commID left join phone on phone.commID=Communication.commidw是否可能存在多个电子邮件地址或电话号码(即CommID值为782的记录是否可以引用电子邮件或电话号码表中的第二条记录)。如果是这样的话,结果应该是什么?不,它是唯一的……当然,“真正”的问题对于日期变量来说要复杂一些,因为客户可能已经更改了他的信息。但真正的问题是我如何将所有相关的信息放在一行中:)
teradata
mysql
?实际的连接语法是什么?你不应该得到三行,你应该加入五个表(或七个),而不是三个。对不起,我犯了一个错误。我的电子邮件和电话表中没有CustomerID。联接语法为sel*from maintable left join Communication on maintable.CustomerID=Communication.CustomerID left join email on email.commID=Communication.commID left join phone on phone.commID=Communication.commidw是否可能存在多个电子邮件地址或电话号码(即CommID值为782的记录是否可以引用电子邮件或电话号码表中的第二条记录)。如果是这样的话,结果应该是什么?不,它是唯一的……当然,“真正”的问题对于日期变量来说要复杂一些,因为客户可能已经更改了他的信息。但真正的问题是我如何将所有相关的信息放在一行中:)
teradata
mysql