2017-05-09 10 views
2

私は、製品と引用符のリストをアカウントとバージョン番号で連結した次のクエリを持っています。SQL別の値を連結する

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

分離文字を削除するのに、substring()ではなく、stuff()を使用することをお勧めします。あなたが必要とどのような、しかし、サブクエリでselect distinctまたはgroup 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ごとに1つの行が返されるため、誤っています。複数の行が他の列に異なる値で存在する場合でも同じです。

注文が不明であることに注意してください。これは最小値RowNoに基づいています。

+0

ありがとうございます。それは非常にうまくいっているようです:)。私は昼食後にさらにテストをします。あなたが想定した順序は正しいです。私は明確にするために、OPのテストデータを更新しました。余計なサブクエリの注釈もありがとう。 –

+0

あなたが精巧な演奏や合理的な演奏へのリンクを気にしているのなら、なぜあなたは '部分文字列 'よりも' stuff'を好むのですか? (前もって感謝します)。 –

+1

@ScottHoltzman。 。 。単にlengthパラメータが必要ないためです。 –