Как переформатировать результат запроса от 2 до 5 столбцов. Col1 'time' имеет до 4 вхождений, а имена Col2 должны быть указаны рядом с правильным временем

У меня есть запрос, который возвращает 2 столбца, 1 является «временем», которое не является уникальным и может иметь до 4 вхождений. Второй столбец - это список имен. В случае необходимости я могу легко добавить третье поле, которое уникально для этих данных, называемых RegId.

Я хочу изменить результаты запроса таким образом, чтобы сократить столбец времени до одного экземпляра (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

Любые идеи были бы очень благодарны.

2
nl ja de
Просьба показать образцы данных и желаемые результаты. Часто будет проще сформулировать новый запрос, чем реконструировать запрошенный запрос, который не сделает то, что вы хотите.
добавлено автор Aaron Bertrand, источник

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

Заметьте, я не тестировал, поэтому у него может быть опечатка (но я сомневаюсь)

1
добавлено
@gallie - yw, пожалуйста, поддержите мой ответ тоже :)
добавлено автор Hogan, источник
Thats great Хоган спасибо за это, хорошо выглядит.
добавлено автор gallie, источник
Извините, я попробовал, но я новичок в этой игре и, видимо, должен создать репутацию, прежде чем смогу это сделать.
добавлено автор gallie, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)