SQL连接不同的值
我有下面的查询,其中我将按帐户和版本号连接产品和报价的列表SQL连接不同的值,sql,sql-server,distinct,Sql,Sql Server,Distinct,我有下面的查询,其中我将按帐户和版本号连接产品和报价的列表 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 uAc
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.-这是一个较大查询的一部分,但一旦这个子查询被解析,它应该很好地流入主查询(至少我认为)。如果人们需要,我可以发布主查询。我更喜欢stuff()
而不是substring()
来删除分隔字符。但是,您需要的是在子查询中选择distinct
或group by
:
额外的子查询是多余的。事实上,这是有误导性的,因为您使用的是选择DISTINCT
,并期望它在每个ProductNo
中返回一行,即使在其他列中存在多个具有不同值的行时也是如此
请注意,订单不清楚。这是基于最低的
行号
谢谢。它似乎工作得很好:)。午饭后我会做更多的测试。你假定的顺序是正确的。为了清晰起见,我在OP中更新了测试数据。感谢多余子查询中的注释。如果您想详细说明或链接到性能rational,您为什么更喜欢stuff
而不是substring
?(提前感谢)。@ScottHoltzman。只是因为不需要length参数。
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, '')