如何在tsql中进行排列(基于集合)

agn*_*tri 2 sql t-sql sql-server sql-server-2005 permutation

我有以下输入

PlayerID    MatchPlayed RunsMade
--------    ----------- --------
1           10              200
2           5               100
3           8               24
4           30              50
Run Code Online (Sandbox Code Playgroud)

输出将是

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
Run Code Online (Sandbox Code Playgroud)

组合匹配玩过列的值的总和这些球员一场比赛列.例如,对于Combined Played 1,2,Combined Combined Played值为10 + 5 = 15.

类似地,Combined Runs Made是各个玩家的Runs MAde列的总和.例如,对于相同的示例,Combined Runs MAde列是200 + 100 = 300.

谢谢

Ale*_*Aza 5

建立:

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
Run Code Online (Sandbox Code Playgroud)

查询:

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
Run Code Online (Sandbox Code Playgroud)