Sql server 一行多行
我知道也有类似的问题,但不幸的是,我还没有找到相应的解决方案 首先,这里是我的表格的简化概述:Sql server 一行多行,sql-server,tsql,Sql Server,Tsql,我知道也有类似的问题,但不幸的是,我还没有找到相应的解决方案 首先,这里是我的表格的简化概述: 合作伙伴表:合作伙伴ID、名称 地址表格:合作伙伴ID、街道、邮政编码、城市、有效期自 联系人表格:PartnerID、TypID、TelNr、Email、ValidFrom 合作伙伴可以有一个或多个地址以及联系信息。有了联系信息,合作伙伴可以有2个电话号码、1个手机号码和1封电子邮件。在表中,它将如下所示: PartnerID TypID TelNr
表:合作伙伴
合作伙伴ID、名称
表格:地址
合作伙伴ID、街道、邮政编码、城市、有效期自
表格:联系人
PartnerID、TypID、TelNr、Email、ValidFrom
PartnerID TypID TelNr Email ValidFrom
1 1 0041 / 044 - 2002020 01.01.2010
1 1 0041 / 044 - 2003030 01.01.2011
1 2 0041 / 079 - 7003030 01.04.2011
1 3 myemail@hotmail.com 01.06.2011
PartnerID Name Street Postcode City TelNr Email
1 SomeGuy MostActualStreet MostActualPC MostActualCity MostActual Nr (either type 1 or 2) MostActual Email
我最终需要的是,将每个合作伙伴的所有表组合起来,如下所示:
PartnerID TypID TelNr Email ValidFrom
1 1 0041 / 044 - 2002020 01.01.2010
1 1 0041 / 044 - 2003030 01.01.2011
1 2 0041 / 079 - 7003030 01.04.2011
1 3 myemail@hotmail.com 01.06.2011
PartnerID Name Street Postcode City TelNr Email
1 SomeGuy MostActualStreet MostActualPC MostActualCity MostActual Nr (either type 1 or 2) MostActual Email
有什么帮助吗?请查看我在另一篇文章中的答案,该文章解释了如何在类似您的案例中获得最真实的信息:
注:DATE_字段在您的案例中是有效的。这里有一些T-SQL,它可以通过“最实际的”得到您想要的答案 你是说“最近的”: 分解它,本例使用(CTE)获取每个合作伙伴的最新地址信息
WITH LatestAddress (PartnerID,Street,PostCode,City)
AS (
SELECT PartnerID,Street,PostCode,City
FROM [Address] a
WHERE ValidFrom = (
SELECT MAX(ValidFrom)
FROM [Address] aMax
WHERE aMax.PartnerID = a.PartnerID
)
)
我将Partner表中的join保留到CTE,因为我不希望没有地址的Partner被排除在结果之外
FROM [Partner] p
LEFT OUTER JOIN LatestAddress la ON p.PartnerID = la.PartnerID
在SELECT语句中,我从Partner表CTE中选择了列,并编写了两个子选择,一个用于每个Partner的最新非空电话号码,另一个用于每个Partner的最新非空电子邮件地址。我可以作为一个子选择来执行此操作,因为我知道通过选择前1返回的是一个标量值
SELECT p.PartnerID,p.Name,la.Street,la.PostCode,la.City
,(SELECT TOP 1 TelNr FROM Contact c WHERE c.PartnerID = p.PartnerID AND TelNr IS NOT NULL ORDER BY ValidFrom DESC) AS MostRecentTelNr
,(SELECT TOP 1 Email FROM Contact c WHERE c.PartnerID = p.PartnerID AND Email IS NOT NULL ORDER BY ValidFrom DESC) AS MostRecentEmail
我强烈建议您将联系人表分为单独的电话号码表和电子邮件表,如果您需要保留旧的电话号码和电子邮件地址,每个表都有自己的ValidDate。您使用的是什么版本的SQL Server?