0

この SQL ステートメントに関連する 3 つのテーブルがあります。

計画

  • プロジェクト レコード ID
  • プロジェクト名

Project_CompetitionCategory

  • ProjectCompetitionCategoryRecordId
  • プロジェクト レコード ID
  • コンペティション カテゴリ レコード ID

競技カテゴリー

  • コンペティション カテゴリ レコード ID
  • 競技カテゴリー名

テーブルから取得しようとしているのはProjectRecordId, ProjectName, CompetitionCategoryName値です。

ただし、Projectは複数の に参加している場合がありますCompetition Category。情報を 1 つの行に配置し、競技を独自の列に配置する必要があります。

以下の例

1. 1 | Project No 1 | Competition 1, Competition 2
2. 2 | Project No 2 | Competition 2, Competition 3, Competition 4
3. 3 | Project No 3 | Competition 1, Competition 4

これは私が持っている現在のSQLステートメントです:

DECLARE @Data VARCHAR(2000)
DECLARE @pID INT
DECLARE @pName VARCHAR(300)

SELECT 
    @pID = Project.ProjectRecordId, 
    @pName = Project.ProjectName,@Data = COALESCE(@Data + ',' + CompetitionCategoryName, CompetitionCategoryName)
FROM 
    Project_CompetitionCategory 
INNER JOIN
    CompetitionCategory ON Project_CompetitionCategory.CompetitionCategoryRecordId = CompetitionCategory.CompetitionCategoryRecordId 
INNER JOIN
    Project ON Project_CompetitionCategory.ProjectRecordId = Project.ProjectRecordId
WHERE 
    Project.ProjectRecordId = 10

SELECT 
   @pID AS 'Project Record ID',  
   @pName AS 'Project Name', 
   @Data AS Competition, 
   (SELECT COUNT(ProjectRecordId) FROM Presentation WHERE ProjectRecordId = @pID) AS 'Number of Recorded Presentations'

外すと

WHERE Project.ProjectRecordId = 10 

次に、最後の値のみをフェッチし、CompetitionCategoryめちゃくちゃになります。

以下のようなもの。

1. 15 | Project No 15 | Competition1, Competition 2, Competition 3, Competition 2, Competition 4

このstackoverflowの記事に対するさまざまな回答を読みました Concatenate many rows into a single text string?

次のようなサイトで解決策を見つけてググった

  1. http://databases.aspfaq.com/general/how-do-i-concatenate-strings-from-a-column-into-a-single-row.html
  2. http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

しかし、私はまだそれに対する解決策を見つけることができません。SQL Server 2008 R2 を使用しています。私は SQL を初めて使用するので、必要なデータを取得できない理由を理解したいと考えています。

前もって感謝します。

4

1 に答える 1

0

あなたが持っているテーブル構造は、そのようなものを照会するようにうまく設計されていません。クエリと連結するのではなく、次のように 1 対多の関係の結果を使用できない理由はありますか。

SELECT p.ProjectRecordId, p.ProjectName, cc.CompetitionCategoryName FROM Project p JOIN Project_CompetitionCategory pcc on p.ProjectRecordId = pcc.ProjectRecordId JOIN CompetitionCategory cc on pcc.CompetitionCategoryRecordId = cc.CompetitionCategoryRecordId

言及したクエリは、選択した projectRecordID のテーブルを連結しますが、recordId を削除すると、すべてのプロジェクトのテーブルで可能なすべてのカテゴリが一覧表示されます。

DECLARE @compCat VARCHAR(1000)

SELECT @compCat = COALESCE(@compCat + ',', '') + cc.CompetitionCategoryName 
FROM Project p JOIN Project_CompetitionCategory pcc on p.ProjectRecordId = pcc.ProjectRecordId JOIN CompetitionCategory cc on pcc.CompetitionCategoryRecordId = cc.CompetitionCategoryRecordId WHERE p.ProjectRecordId=10

この時点で、@compCat にはプロジェクト 10 のコンペティション カテゴリのみが含まれます。プロジェクト 10 フィルタを削除すると、すべてのプロジェクトのカテゴリのリストが表示されます。この方法で連結された結果を取得するには、projectId を選択して連結クエリに渡すカーソルを使用して SQL を記述する必要があります。以下のようなものです。

DECLARE @compCat VARCHAR(1000)
DECLARE projectIdSelect CURSOR FOR SELECT ProjectRecordId FROM Project

OPEN projectIdSelect
FETCH NEXT FROM projectIdSelect INTO @projectID
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @compCat = ''
    SELECT @compCat = COALESCE(@compCat + ',', '') + cc.CompetitionCategoryName 
    FROM Project p JOIN Project_CompetitionCategory pcc on p.ProjectRecordId = pcc.ProjectRecordId JOIN CompetitionCategory cc on pcc.CompetitionCategoryRecordId = cc.CompetitionCategoryRecordId WHERE p.ProjectRecordId=@vars
    PRINT('Project ID: ' + @vars + ' | ' + @compCat)    
END
CLOSE projectIdSelect 
DEALLOCATE projectIdSelect 
于 2012-07-30T13:54:03.590 に答える