使用变量命名列
Naming a Column using Variable
我想计算一系列游戏中所有玩家的升分差异。我希望第一列名称 PD1 具有最少的点差,PD2 次之,依此类推。我希望使用一个变量来执行此操作,该变量仅根据游戏数量将整数添加到 'PD' 的末尾。当我将 AS @ColumnName 添加到计算的末尾时,我不断收到错误消息。
USE [Rugby Pools]
DECLARE @counter int
DECLARE @MaxPlayer int
DECLARE @ColumnName varchar(50)
SET @counter = (SELECT MIN([Player_ID]) FROM [dbo].[Players])
SET @MaxPlayer = (SELECT MAX([Player_ID]) FROM [dbo].[Players])
DECLARE @gamecounter int
DECLARE @MaxGame int
SET @gamecounter = (SELECT MIN([Game_ID]) FROM [dbo].[Match])
SET @MaxGame = (SELECT MAX([Game_ID]) FROM [dbo].[Match])
SET @ColumnName='PD'+@gamecounter
WHILE @gamecounter <= @MaxGame
BEGIN
WHILE @counter <= @MaxPlayer
BEGIN
SELECT TOP (@gamecounter) dbo.Players.Player_ID, dbo.Entries.Game_ID, ABS(ABS(dbo.Entries.Home_Score-dbo.Entries.Away_Score)-(dbo.Match.Home_Score-dbo.Match.Away_Score)) AS @ColumnName
FROM Entries INNER JOIN
Match ON Entries.Game_ID = Match.Game_ID INNER JOIN
Players ON Entries.Player_ID = Players.Player_ID
WHERE dbo.Match.Home_Score IS NOT NULL AND dbo.Players.Player_ID=@counter
ORDER BY Players.Player_ID, PointsDiff1 ASC
SET @Counter += 1
END
SET @gamecounter += 1
END
一旦开始工作,我将能够对其进行更改以更新 table,这将使我能够提供一个联盟 table 由获胜决定的球员,然后是整个课程的最佳分差比赛的。
像这样将最终查询部分更改为动态 sql。只有动态sql.
才能实现
declare @query nvarchar(max)
set @query = ' SELECT TOP (' + cast(@gamecounter as varchar(10)) + ') dbo.Players.Player_ID,
dbo.Entries.Game_ID, ABS(ABS(dbo.Entries.Home_Score-dbo.Entries.Away_Score)-(dbo.Match.Home_Score-dbo.Match.Away_Score)) AS ' + QUOTENAME(@ColumnName) + '
FROM Entries INNER JOIN
Match ON Entries.Game_ID = Match.Game_ID INNER JOIN
Players ON Entries.Player_ID = Players.Player_ID
WHERE dbo.Match.Home_Score IS NOT NULL AND dbo.Players.Player_ID= ' + cast(@counter as varchar(10)) + '
ORDER BY Players.Player_ID, PointsDiff1 ASC'
sp_executesql @query
我想计算一系列游戏中所有玩家的升分差异。我希望第一列名称 PD1 具有最少的点差,PD2 次之,依此类推。我希望使用一个变量来执行此操作,该变量仅根据游戏数量将整数添加到 'PD' 的末尾。当我将 AS @ColumnName 添加到计算的末尾时,我不断收到错误消息。
USE [Rugby Pools]
DECLARE @counter int
DECLARE @MaxPlayer int
DECLARE @ColumnName varchar(50)
SET @counter = (SELECT MIN([Player_ID]) FROM [dbo].[Players])
SET @MaxPlayer = (SELECT MAX([Player_ID]) FROM [dbo].[Players])
DECLARE @gamecounter int
DECLARE @MaxGame int
SET @gamecounter = (SELECT MIN([Game_ID]) FROM [dbo].[Match])
SET @MaxGame = (SELECT MAX([Game_ID]) FROM [dbo].[Match])
SET @ColumnName='PD'+@gamecounter
WHILE @gamecounter <= @MaxGame
BEGIN
WHILE @counter <= @MaxPlayer
BEGIN
SELECT TOP (@gamecounter) dbo.Players.Player_ID, dbo.Entries.Game_ID, ABS(ABS(dbo.Entries.Home_Score-dbo.Entries.Away_Score)-(dbo.Match.Home_Score-dbo.Match.Away_Score)) AS @ColumnName
FROM Entries INNER JOIN
Match ON Entries.Game_ID = Match.Game_ID INNER JOIN
Players ON Entries.Player_ID = Players.Player_ID
WHERE dbo.Match.Home_Score IS NOT NULL AND dbo.Players.Player_ID=@counter
ORDER BY Players.Player_ID, PointsDiff1 ASC
SET @Counter += 1
END
SET @gamecounter += 1
END
一旦开始工作,我将能够对其进行更改以更新 table,这将使我能够提供一个联盟 table 由获胜决定的球员,然后是整个课程的最佳分差比赛的。
像这样将最终查询部分更改为动态 sql。只有动态sql.
才能实现 declare @query nvarchar(max)
set @query = ' SELECT TOP (' + cast(@gamecounter as varchar(10)) + ') dbo.Players.Player_ID,
dbo.Entries.Game_ID, ABS(ABS(dbo.Entries.Home_Score-dbo.Entries.Away_Score)-(dbo.Match.Home_Score-dbo.Match.Away_Score)) AS ' + QUOTENAME(@ColumnName) + '
FROM Entries INNER JOIN
Match ON Entries.Game_ID = Match.Game_ID INNER JOIN
Players ON Entries.Player_ID = Players.Player_ID
WHERE dbo.Match.Home_Score IS NOT NULL AND dbo.Players.Player_ID= ' + cast(@counter as varchar(10)) + '
ORDER BY Players.Player_ID, PointsDiff1 ASC'
sp_executesql @query