2017-05-09 10 views
1

私はサービスとContractorIDのリストを返すクエリを持っています。私はContractorIDによって別の選択された声明にそれらを参加させるためにフィールドにこれらのサービスを詰め込む必要がありますが、私はそれを行う方法を理解できません。サブクエリからのSQLステートメント

サービスを一覧表示を選択し、「

SELECT DISTINCT SM.ContractorID, 

CASE WHEN S.bitRestrictedSelection = 1 
     THEN S.vchDescription + '*' 
     ELSE S.vchDescription 
    END AS vchDescription 
FROM tblAscServiceRegionToOperator SRTO 
INNER JOIN tblServiceMatrix SM 
    ON SRTO.OperatorID = 12624 
    AND SM.ServiceRegionID = SRTO.ServiceRegionID 
    AND SM.bitPrimaryService = 1 
INNER JOIN tblServices S 
    ON S.ServiceID = SM.ServiceID 

ですこれは、以下を生成します。

例で

enter image description here

、契約者の#16のために彼は、私はそれらを置く必要がある4つのサービスを提供しています別のSelectステートメントに参加してサービスと呼ばれる1つのフィールド 私は以下を試しましたが、エラーが発生します:

Select DISTINCT CompanyID, vchCompanyName as CompanyName,vchFIDNumber,vchPrimContactName, vchPrimContactEmail 
,stuff((',' 
    SELECT DISTINCT 
    SM.ContractorID, 

     CASE WHEN S.bitRestrictedSelection = 1 
      THEN S.vchDescription + '*' 
      ELSE S.vchDescription 
     END AS vchDescription 
    FROM tblAscServiceRegionToOperator SRTO 
    INNER JOIN tblServiceMatrix SM 
     ON SRTO.OperatorID = 12624 
     AND SM.ServiceRegionID = SRTO.ServiceRegionID 
     AND SM.bitPrimaryService = 1 
    INNER JOIN tblServices S 
     ON S.ServiceID = SM.ServiceID 
     FOR XML PATH('') 
       ), 1, 1, '') as Services from tblCompany 

ご協力いただければ幸いです!

+2

"Common Table Expressions"(CTE)を参照すると、サブクエリをカプセル化してテーブルのように見えるようになり、SQLコードを単純化することができます。それはずっと簡単に参加できます。問題を個々のCTEに分割してから、それらを結び付けて必要なクエリを構築することは、非常に便利なアプローチになります。 – pmbAustin

+0

あなたはどんなエラーが起こりますか? –

答えて

1

次のクエリでは動作します:

SELECT SS.contractor Contractor, 
     STUFF((SELECT '; ' + US.vchdescription 
       FROM ServicesList US 
       WHERE US.contractor = SS.contractor 
       FOR XML PATH('')), 1, 1, '') [Services] 
FROM ServicesList SS 
GROUP BY SS.contractor 
ORDER BY 1 

私はテーブルを作成し、あなたのアイデアを取得するために、そこに請負業者= 16のための2つの行を挿入しました。 コメント内のあなたの提案を使用して、最初の選択をCTEにラップし、次にそのCTESTUFF関数を実行できます。

このクエリのデモを確認できますhere