2

2つの列を返すクエリがあります。1つは「時間」であり、一意ではなく、最大4回出現する可能性があります。2列目は「名前」のリストです。必要に応じて、RegIdと呼ばれるこのデータに固有の3番目のフィールドを簡単に追加できます。

時間列を1つのインスタンス(GROUP BY)に減らすようにクエリの結果を変更したいのですが、すべての名前を以下のような表形式で水平方向に表示したいと思います。

'Start Time'  'Player 1'   'Player 2'   'Player 3'  'Player 4'

これまでのところ、PIVOTコマンドの使用に失敗しましたが、そのトリックが欠落している可能性があります。使用すべき簡単なコマンドはありますか?

私がそれに最も近いものは次のとおりです。

DECLARE @Registered TABLE
(CompetitionName VARCHAR(50),
CompetitionDate  Date,
StartTime TIME,
PlayersName  Varchar(60)
)
INSERT INTO @Registered
SELECT MAX(c.CompetitionName) AS 'Competition Name', MAX(c.[Date]) AS 'Competition Date', 
CONVERT(VARCHAR, r.PlayersStartTime, 108) AS 'Start Time', 
CASE WHEN m.MemberId IS NOT NULL THEN (m.Surname + ', ' + m.FirstName) ELSE (nm.Surname + ', '+ nm.Firstname) END AS PlayersName
FROM dbo.Competitions c
LEFT JOIN [dbo].[Registration] r ON c.[CompetitionId] = r.[CompetitionId]
LEFT JOIN dbo.Members m ON r.MemberId = m.MemberId
LEFT JOIN dbo.NonMembers nm ON r.NonMemberId = nm.NonMemberId
WHERE Date = '2013-01-04' AND c.CompetitionId = 10
GROUP BY r.PlayersStartTime, m.MemberId, m.FirstName, m.Surname, nm.FirstName, nm.Surname
----
SELECT [@Registered].StartTime, [@Registered].PlayersName AS 'Player 1', [@Registered].PlayersName AS 'Player 2',
[@Registered].PlayersName AS 'Player 3',[@Registered].PlayersName AS 'Player 4'
FROM @Registered

どんなアイデアでも大歓迎です。

4

1 に答える 1

1

コンマで区切られたリストを取得するためのトリックを次に示します。

次のようになります。

StartTime    PlayerList
5:00         Sam, David, Joe
6:00         Lisa, Bart, Victor

これを行うには、次のようなクエリを使用します (XML の「トリック」)

SELECT DISTINCT Main.StartTime, 
 STUFF((SELECT ', ' + PlayersName
  FROM [@Registered] Inner
  WHERE Inner.StartTime = Main.StartTime 
  FOR XML PATH ('')),1,2,'') AS PlayerList
FROM [@Registered] Main

注、私はテストしていないので、タイプミスがあるかもしれません(しかし、私はそれを疑っています)

于 2013-01-09T17:10:25.887 に答える