誰もこれに答えを与えていないと見て、私は私もあなたに、動的SQLでこれを行うには(おそらく非効率的な)方法を1が表示される場合があります図:
DECLARE @SQL NVARCHAR(MAX) = N'';
SELECT TOP (SELECT CASE COUNT(*) % 2 WHEN 1 THEN COUNT(*) ELSE COUNT(*) - 1 END FROM dbo.Teams) @SQL += N' UNION ALL
SELECT *
FROM
(
SELECT TOP (SELECT COUNT(*)/2 FROM T)
Team,
RN,
RoundNum = ' + CAST(N AS NVARCHAR(3)) + N',
Match = ROW_NUMBER() OVER (ORDER BY CASE WHEN RN = 1 THEN 0 ELSE 1 END, (RN + ' + CAST(N - 2 AS NVARCHAR(3)) + N') % (SELECT COUNT(*) FROM T)),
Slot = 1
FROM T
ORDER BY CASE WHEN RN = 1 THEN 0 ELSE 1 END, (RN + ' + CAST(N - 2 AS NVARCHAR(3)) + N') % (SELECT COUNT(*) FROM T)
UNION ALL
SELECT TOP (SELECT COUNT(*)/2 FROM T)
Team,
RN,
RoundNum = ' + CAST(N AS NVARCHAR(3)) + N',
Match = ROW_NUMBER() OVER (ORDER BY CASE WHEN RN = 1 THEN 1 ELSE 0 END, (RN + ' + CAST(N - 2 AS NVARCHAR(3)) + N') % (SELECT COUNT(*) FROM T) DESC),
Slot = 2
FROM T
ORDER BY CASE WHEN RN = 1 THEN 1 ELSE 0 END, (RN + ' + CAST(N - 2 AS NVARCHAR(3)) + N') % (SELECT COUNT(*) FROM T) DESC
) AS T
'
FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM sys.objects) T(N)
ORDER BY N;
SELECT @SQL = N'
WITH T AS
(
SELECT Team, RN = ROW_NUMBER() OVER (ORDER BY Team)
FROM dbo.Teams
UNION ALL
SELECT ''Bye'', COUNT(*) + 1
FROM dbo.Teams
HAVING COUNT(*) % 2 = 1
),
CTE2 AS
(
' + STUFF(@SQL, 1, 11, '') + N'
)
SELECT T1.RoundNum, T1.Match, Team1 = T1.Team, Team2 = T2.Team
FROM
(
SELECT *
FROM CTE2
WHERE Slot = 1
) AS T1 JOIN
(
SELECT *
FROM CTE2
WHERE Slot = 2
) AS T2
ON T2.RoundNum = T1.RoundNum
AND T2.Match = T1.Match;';
EXEC sp_executesql @SQL;
基本的には、それがfix one of the contributors in the first or last column of the table
は説明しませんあなたのwikiリンクに1を据え、すべてのチームを1の周りにシフトさせてください。奇数チームの場合、それは「バイバイ」の対戦相手を追加します。そして、テーブルをNまたはN-1回(偶数または奇数のチームがあるかどうかに応じて)循環させるだけです。
出典
2017-04-18 05:05:41
ZLK