SQL - 如何将几个非常相似的行“展平”为1

时间:2013-06-19 17:38:17

标签: sql sql-server

如果标题不清楚,我会道歉 - 我只是不知道如何描述这个问题,而且我真的根本不了解SQL。

我正在使用我们的案例管理系统使用的数据库。在某些地方,开发商已经明显地延长了它们。我正在处理联系方式(姓名,地址等),他们已经添加了额外的字段来处理电子邮件地址,并允许家庭/工作/手机号码等...

问题在于他们没有为每个新领域添加新字段。他们在2个不同的表中添加了几个字段 - 第一个字段包含字段名称,第二个字段包含实际数据。

第一个在名为AdditionalAddElTypes的表中称为AddElTypeText - AddElTypeText字段包括类似"工作电话1","传真","家庭电子邮件"等...(总共有10个不同的值,我不能看到开发人员很快就会扩展这个数字)

第二个字段在名为AdditionalAddressElements的表中称为AddElementText - 然后AddElementText包含实际数据,例如:电话号码,电子邮件地址。

对于那些(与我不同)发现更容易查看SQL代码的人,它是:

SELECT
  Address.AddressLine1
  ,AdditionalAddElTypes.AddElTypeText
  ,AdditionalAddressElements.AddElementText
FROM
  Address
  INNER JOIN AdditionalAddressElements
    ON Address.AddressID = AdditionalAddressElements.AddressID
  INNER JOIN AdditionalAddElTypes
    ON AdditionalAddressElements.AddElTypeID = AdditionalAddElTypes.AddElTypeID

我可以使用此功能,但如果有任何联系人有2个或更多"额外"我得到多行,大部分数据是相同的,但只有AddElTypeText和AddElementText的2列不同。

所以任何人都可以提出任何建议,以及#34; flatten"联系成一排。我想到了将AddElTypeText和AddElementText连接到单个字符串字段中的事情,理想情况是在AddElTypeText和AddElementText之间有一个空格,然后是:或者,将AddElTypeText和AddElementText对分开。

但是,我很少知道如何实现这一目标,或者完全不同的方法是否会更好。非常感谢任何帮助!

加里

1 个答案:

答案 0 :(得分:1)

正如@ twn08所说,此类问题以前一直被问到。在SQL Server中进行这种分组连接通常很麻烦,涉及使用FOR XML

话虽如此,here's a SQLFiddle(我相信)做了类似你想要的事情。这是实际的查询:

WITH Results AS
(
  SELECT a.*,
    t.AddElTypeText,
    aa.AddElementText
  FROM
    Address a
  INNER JOIN
    AdditionalAddressElements aa
    ON a.AddressID = aa.AddressID
  INNER JOIN
    AdditionalAddElTypes t
    ON aa.AddElTypeID = t.AddElTypeID
)
SELECT
  res.AddressID,
  STUFF((
    SELECT ', ' + AddElTypeText + ': ' + AddElementText 
    FROM Results
    WHERE (AddressID = res.AddressID) 
    FOR XML PATH (''))
  ,1,2,'') AS AdditionalElements
FROM Results res
GROUP BY res.AddressID