SQL连接不同的值

时间:2017-05-09 15:47:41

标签: 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 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。 - 这是一个更大的查询的一部分,但是一旦这个子查询被解析,它应该流入主要的一个就好了(至少我认为)。如果有人需要,我可以发布主查询。

1 个答案:

答案 0 :(得分:3)

我更喜欢substring()而不是select distinct来删除分隔字符。但是,您需要的是子查询中的group bystuff((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返回一行 - 即使存在其他列中具有不同值的多行。

请注意,排序不清楚。这基于最小[...]/jdk/make/src/classes/build/tools/taglet/ExtLink.java:37: error: cannot find symbol import jdk.javadoc.doclet.Taglet; ^ symbol: class Taglet location: package jdk.javadoc.doclet