2013-06-19 21 views
1

如果標題不明確,我會道歉 - 我只是不知道如何描述這個問題,而且我真的不知道SQL如何。SQL - 如何將幾個非常相似的行「扁平化」爲1

我正在使用我們案例管理系統使用的數據庫。在很多地方,開發人員已經明顯延長了這個時間。我正在處理聯繫人詳細信息(姓名,地址等...),他們添加了額外的字段來處理電子郵件地址,並允許家庭/工作/手機號碼等...

問題是,他們沒有爲每個新領域添加新的領域。他們在兩個不同的表格中添加了幾個字段 - 第一個字段包含字段名稱,第二個字段包含實際數據。

第一個名爲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列是不同的。

因此,任何人都可以提出任何建議,將聯繫人「扁平化」爲單行。我想到了將AddElTypeText和AddElementText連接成單個字符串字段的方法,理想情況是在AddElTypeText和AddElementText之間有一個空格,然後a:或分隔AddElTypeText和AddElementText對。

但是,我很少知道如何實現這一點,或者是否採用完全不同的方法會更好。任何幫助非常感激地收到!

加里

+0

你可以用你的創建表語句爲每個表編輯你的文章,一些示例數據和所需的結果? – Taryn

+0

討論串分組還有其他問題,例如, [這裏](http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings-in-sql-server)。在一些RDBM中,已經有了內置的函數(例如在PostgreSQL中有'array_agg()'。) –

+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 
+0

謝謝!說實話,我並沒有期望或希望任何人爲我執行代碼,但通過一些修改來適應我正在處理的細節(以及DISTINCT刪除重複的行:-)),這個非常有效地工作。人們已經鏈接到的其他選項在其他一些數據庫結構相同但我想要的不同的其他情況下會非常有用。所以再次,謝謝所有 – user2468300

+0

@ user2468300:沒問題 - 歡迎來到StackOverflow! – voithos