Как выполнить перестановку в tsql (на основе набора)

#sql #sql-server #sql-server-2005 #tsql #permutation

#sql #sql-сервер #sql-server-2005 #tsql #перестановка

Вопрос:

У меня есть следующие входные данные

 PlayerID    MatchPlayed RunsMade
--------    ----------- --------
1           10              200
2           5               100
3           8               24
4           30              50
  

Результатом будет

 Combined Players    Combined Match Played   Combined runs Made  
----------------    ---------------------   ------------------  
1                   10                      200         
1,2                 15                      300         
1,3                 18                      224
1,4                 40                      250
1,2,3               23                      324
1,2,4               45                      350
1,3,4               48                      274
1,2,3,4             53                      374
2                   5                       100
2,3                 13                      124
2,4                 35                      150
2,3,4               43                      174
3                   8                       24
3,4                 38                      74
4                   30                      50
  

В сочетании матч столбца равно сумме значений матч колонна из тех игроков. например, для совместных играл в 1,2 в сочетании матче значение равно 10 5 = 15.

аналогично, выполненные комбинированные пробеги представляют собой сумму столбцов Выполненных пробегов отдельных игроков. например, для того же примера столбец выполненных комбинированных пробегов равен 200 100 = 300.

Спасибо

Комментарии:

1. Хотя я уверен, что это можно сделать в T-SQL, я бы посоветовал выполнить перестановку на другом языке, например VB.Net / C # / C и т.д. Запрос, который потребовался бы для генерации этого вывода, вероятно, будет сложным и вполне может усложниться по мере привлечения большего числа игроков.

2. Это правильно, но вряд ли есть какой-либо выбор

Ответ №1:

Настройка:

 create table Input(PlayerId int, MatchPlayed int, RunsMade int)

insert Input
  select 1, 10, 200
  union all select 2, 5, 100
  union all select 3, 8, 24
  union all select 4, 30, 50
  

Запрос:

 with cte(Combined, PlayerId, MatchPlayed, RunsMade)
as
(
    select cast(PlayerId as varchar(500)), PlayerId, MatchPlayed, RunsMade
    from Input
    union all
    select cast(cte.Combined   ','   cast(inp.PlayerId as varchar) as varchar(500)), inp.PlayerId, inp.MatchPlayed   cte.MatchPlayed, inp.RunsMade   cte.RunsMade
    from cte
        join Input inp on
            cte.PlayerId < inp.PlayerId
)
select Combined, MatchPlayed, RunsMade
from cte
order by Combined
  

Комментарии:

1. можете ли вы прислать какой-нибудь пример руководства по значению combined. Извините, не понимаю, как здесь используется CTE.combined.