web-dev-qa-db-ja.com

コンマ区切りの結果セットを持つSQLサーバーサブクエリ

テーブルのレコードを返す必要があり、結果セットにはコンマ区切りのリストを含める必要があります。

3つのテーブルの画像を添付しました。最初のテーブルにレコードを返す選択を行い、スクリーンショットの3番目のテーブルに存在する最後のAwardFocusNameを含める必要があります。

したがって、私の結果セットは1つのレコードを返し、その中にAwardFocusNamesのリストを含めます(カンマ区切り)。

enter image description here

25
obautista

これは、私が過去に同じようなことをするために使用したトリックです。 [〜#〜] substring [〜#〜] 関数を使用します。

 
 SELECT n.nominationID 
、SUBSTRING((
 SELECT '、' + naf.awardFocusName 
 FROM NominationAwardFocus naf 
 JOIN AwardFocus af 
 ON naf.awardFocusID = af.awardFocusID 
 WHERE n.nominationID = naf.nominationID 
 FOR XML PATH( '')
 
 )、2、1000000)
 FROMノミネーションn 
 

2は、副選択が最初の項目に追加する先行コンマを切り取るために使用され、1000000は「文字列の残りのすべて」を意味する大きな数として選択されることに注意してください。

56
Alex

このようなスカラー値関数を作成します

CREATE FUNCTION [dbo].[CreateCSV](
    @Id AS INT
)
RETURNS VARCHAR(MAX)
AS
BEGIN
    Declare @lst varchar(max)

    select @lst = isnull(@lst+',','')+AF.AwardFocusName
    from AwardFocus as AF
    inner join AwardFoccusNomination as AFN
        on AF.AwardFocusID = AFN.AwardFocusID
    where AFN.NominationID=@Id


    return @lst

END
2
wcm

私はこれを私のブログでここに行う方法を説明します:

http://johniekarr.wordpress.com/2011/08/08/pushing-multiple-results-into-one-column/

2
Johnie Karr

最善の解決策は、(グループ内の)値をコンマ区切りのリストに連結するユーザー定義集計を作成することだと思います。 例1を参照してください: http://msdn.Microsoft.com/en-us/library/ms131056.aspx

使用法:

SELECT 
     Nomination.NominationId, 
     Nomination.Created,
     Nomination.Updated,
     dbo.Concatenate(AwardFocus.AwardFocusName) As Names
FROM 
     Nomination
     JOIN NominationAwardFocus 
       ON Nomination.NominationId = NominationAwardFocus.NominationId 
     JOIN AwardFocus
       ON NominationAwardFocus.AwardFocusId = AwardFocus.AwardFocusId
GROUP BY  
     Nomination.NominationId, 
     Nomination.Created,
     Nomination.Updated
1
Magnus