SQL 服务器 - 使用 CAST() 时在列上应用 OrderBy

SQL Server - Apply OrderBy on columns when used CAST()

在我的游戏应用程序中,我有团队,每个团队可以有任意数量的玩家,如果玩家参加比赛,我会给他 5 分。每次玩家参加一场比赛,他将获得 5 分。

我的存储过程将 TeamId 作为输入参数。

现在我想按月计算每支球队的总参与积分,但是这里每个球员的参与积分应该加到该球员参加比赛的最后一个月。

假设 Team1 有 Player1 并且 player1 总共打了 4 场比赛,1 场比赛在 04/2020,2 场比赛在 06/2020 和 1 场比赛在 08/2020,这里 Team1 的 Player1 打了 4 场比赛得到 20参与积分和 Player1 参加的最后一场比赛是在 08/2020,因此 Team1 的所有 20 分都应添加到 08/2020

在玩家 table 中,每个玩家都有一个 [TotalMatchesPlayed],[TotalMatchesPlayed] * 5 会给我每个玩家的 [TotalParticipationPoints]。

这应该对团队中的所有玩家重复。

SELECT DISTINCT TP.[TeamId], ISNULL(P.[TotalMatchesPlayed], 0) * 5 AS [ParticipationPoints], CAST(MONTH(PA.[ActivityDate]) AS VARCHAR(2)) AS [Month], CAST(YEAR(PA.[ActivityDate]) AS VARCHAR(4)) AS [Year] FROM [TeamPlayers] TP
INNER JOIN dbo.[Player] P
ON TP.[PlayerId] = P.[PlayerId]
INNER JOIN dbo.[PlayerActivity] PA
ON PA.[PlayerId] = P.[PlayerId] AND PA.[ActivityTypeId] = 14
WHERE TP.[TeamId] = 12

我对上述查询的问题是 [PlayerActivity] table 每次玩家参加比赛时都有一行,现在我只想获取最新日期并将所有参与点数添加到那个月,然后我无法实现的年份

我尝试添加 ORDER BY PA.[ActivityDate] DESC 但抛出错误

Order by items must appear in the select list if SELECT DISTINCT is specified.

我的示例输出应该如下所示

 ParticipationPoints | Month |  Year
       50                03     2020
        0                04     2020
       20                05     2020

样本 table 设计和数据在下面 link.

http://sqlfiddle.com/#!18/41766/1

您调用了一些 [Activity 日期] 字段,因此您应该 select 以上转换之一作为顺序

SELECT DISTINCT TP.[TeamId], ISNULL(P.[TotalMatchesPlayed], 0) * 5 AS [ParticipationPoints], CAST(MONTH(PA.[ActivityDate]) AS VARCHAR(2)) AS [Month], CAST(YEAR(PA.[ActivityDate]) AS VARCHAR(4)) AS [Year] FROM [TeamPlayers] TP
INNER JOIN dbo.[Player] P
ON TP.[PlayerId] = P.[PlayerId]
INNER JOIN dbo.[PlayerActivity] PA
ON PA.[PlayerId] = P.[PlayerId] AND PA.[ActivityTypeId] = 14
WHERE TP.[TeamId] = 12
ORDER BY CAST(MONTH(PA.[ActivityDate]) AS VARCHAR(2)) desc

这对你有用吗:

SELECT 
TP.[TeamId]
, SUM(ISNULL(P.[TotalMatchesPlayed], 0)) * 5 AS [ParticipationPoints]
, DATEPART(MONTH,PA.[ActivityDate]) AS [Month]
, DATEPART(YEAR,PA.[ActivityDate]) AS [Year] 
FROM [TeamPlayer] TP
INNER JOIN dbo.[Player] P
ON TP.[PlayerId] = P.[PlayerId]
INNER JOIN dbo.[PlayerActivity] PA
ON PA.[PlayerId] = P.[PlayerId] AND PA.[PlayerActivityTyepId] = 14
WHERE TP.[TeamId]=45

GROUP BY TP.[TeamId], DATEPART(MONTH,PA.[ActivityDate]), DATEPART(YEAR,PA.[ActivityDate])
ORDER BY DATEPART(MONTH,PA.[ActivityDate]) DESC, DATEPART(YEAR,PA.[ActivityDate]) DESC