2017-05-09 73 views
2

我有以下查詢,其中我按帳戶和版本號連接產品和報價列表。SQL Concatenate Distinct Values

SELECT DISTINCT ST2.Account_No, ST2.version_num, 
    substring((SELECT ',' + ST1.ProductNo AS [text()] 
      FROM (SELECT DISTINCT Account_No, version_num, ProductNo, QuoteNo, RowNo 
        FROM uAccountProductInfo) ST1 
      WHERE ST1.version_num = ST2.version_num 
       AND ST1.Account_No = ST2.Account_No 
      ORDER BY ST1.RowNo, ST1.Account_No,ST1.version_num 
      FOR XML PATH ('')) 
    , 2, 1000) [AllProduct] 
    , 
    substring((SELECT ','+ ST3.QuoteNo AS [text()] 
      FROM (SELECT DISTINCT Account_No, version_num, ProductNo, QuoteNo, RowNo 
      FROM [uAccountProductInfo]) ST3 
      WHERE ST3.version_num = ST2.version_num 
       AND ST3.Account_No = ST2.Account_No 
      ORDER BY ST3.RowNo, ST3.version_num 
      FOR XML PATH ('')) 
    , 2, 1000) [AllQuote] 
FROM uAccountProductInfo ST2 

我遇到的問題是返回值沒有顯示不同的結果。我瞭解它發生的原因,但無法弄清楚如何調整它。

返回結果看這個:

Account version_num  AllProduct AllQuote  
1   2    aaa,aaa,aaa 111,111,111 
1   3    aaa,aaa,bbb 111,111,222 

我要的是

Account version_num  AllProduct AllQuote  
1   2    aaa,   111 
1   3    aaa,bbb  111,222 

測試數據將是這樣:

Account version_num LOB Package Product Quote RowNo 
1   2    GL  1   aaa  111  1 
1   2    AU  1   aaa  111  2  
1   2    PF  1   aaa  111  3 
1   3    GL  1   aaa  111  1 
1   3    AU  1   aaa  111  2 
1   3    WK  0   bbb  222  3 

它們與的多個實例返回的原因同一產品|報價是由於列入了RowNo列。我之前排除了這種情況,之前返回了不同的值列表,但我需要按RowNo排序,以便值以特定順序排列。

整個上午我一直在絞盡腦汁,但無法弄清楚如何調整查詢以僅返回頂層的不同值。

有什麼建議嗎?

n.b. - 這是一個更大的查詢的一部分,但一旦這個子查詢被解決,它應該流入主要的一個很好(至少我認爲)。如果人們需要,我可以發佈主查詢。

回答

3

我更喜歡stuff()而不是substring()刪除分隔字符。你需要什麼,雖然是在子查詢select distinctgroup by

stuff((SELECT ',' + ST1.ProductNo AS [text()] 
     FROM uAccountProductInfo ST1 
     WHERE ST1.version_num = ST2.version_num AND 
      ST1.Account_No = ST2.Account_No 
     GROUP BY ST1.ProductNo 
     ORDER BY MIN(ST1.RowNo) 
     FOR XML PATH ('') 
    ), 1, 1, '') 

你的其他子查詢是多餘的。實際上,這是誤導性的,因爲您使用的是SELECT DISTINCT,並且期望它每ProductNo返回一行 - 即使多行在其他列中存在不同的值時也是如此。

請注意,排序不清楚。這基於最低RowNo

+0

感謝您的支持。它似乎工作得很好:)。午餐後我會再測試一次。您假定的順序是正確的。爲了清楚起見,我在OP中更新了測試數據。感謝您在多餘子查詢中的註釋。 –

+0

好奇你爲什麼比'substring'更喜歡'stuff',如果你喜歡精心製作或鏈接到性能理性? (提前致謝)。 –

+1

@ScottHoltzman。 。 。只是因爲長度參數是不需要的。 –