2017-05-09 47 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。 。 。只是因为长度参数是不需要的。 –