首页 > 解决方案 > 在 SQL 计算中使用两个列别名

问题描述

这是此 StackOverflow 帖子的后续问题。我试图一次使用两个别名,但它似乎不起作用。

一些背景:我正在使用 Microsoft SQL Server。我有来自 StackExchange 站点的帖子和用户数据集。我有这个 SQL 语句,它成功地列出了每个用户的得分总和以及得分大于零的每个用户的视图总和。

SELECT Users.Id, SUM(Posts.Score) AS ScoreSum, SUM(Posts.ViewCount) AS ViewSum
  FROM [tsql-dml].[dbo].[Posts] AS Posts
  INNER JOIN [tsql-dml].[dbo].[Users] AS Users
  ON Posts.OwnerUserId = Users.Id
  WHERE Posts.Score > 0
  GROUP BY Users.Id
  ORDER BY ViewSum DESC

接下来,我想做的是获取 ViewSum 列与 ScoreSum 列的比率。如上面链接的帖子中所述,直接使用列别名不起作用,但(SELECT Alias)有效。似乎包括这些括号是必要的。我试过这个(只显示查询的选择部分,其余相同):

SELECT Users.Id, SUM(Posts.Score) AS ScoreSum, SUM(Posts.ViewCount) AS ViewSum,
(SELECT(ViewSum)) / (SELECT(ScoreSum)) AS ViewScoreRatio

这会在 SQL 中产生以下错误:

Msg 207, Level 16, State 1, Line 2
Invalid column name 'ViewSum'.
Msg 207, Level 16, State 1, Line 2
Invalid column name 'ScoreSum'.

所以我想,也许我必须把括号括起来。我试过这个:

SELECT Users.Id, SUM(Posts.Score) AS ScoreSum, SUM(Posts.ViewCount) AS ViewSum,
(SELECT(ViewSum) / SELECT(ScoreSum)) AS ViewScoreRatio

有了这个,ViewSum 的左侧 SELECT 不会显示错误,但右侧会失败。

Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'SELECT'.
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ')'

然后我想,如果我需要双向括号怎么办?所以我尝试了这个:

SELECT Users.Id, SUM(Posts.Score) AS ScoreSum, SUM(Posts.ViewCount) AS ViewSum,
((SELECT(ViewSum)) / (SELECT(ScoreSum))) AS ViewScoreRatio

这与第一次尝试相同的消息失败:

Msg 207, Level 16, State 1, Line 2
Invalid column name 'ViewSum'.
Msg 207, Level 16, State 1, Line 2
Invalid column name 'ScoreSum'.

如何在 SQL 计算中使用两列别名?

到目前为止,我发现的唯一解决方法是重新计算总和,但我担心这效率低下:

SELECT Users.Id, SUM(Posts.Score) AS ScoreSum, SUM(Posts.ViewCount) AS ViewSum,
SUM(Posts.ViewCount) / SUM(Posts.Score) AS ViewScoreRatio

标签: sqlsql-server

解决方案


您不能在定义它的同一查询中使用 alias*,但很容易将它放在子查询中

SELECT Id,ScoreSum,ViewSum, ViewSum/ScoreSum AS ViewScoreRatio FROM 
   ( SELECT 
        Users.Id, 
        SUM(Posts.Score) AS ScoreSum, 
        SUM(Posts.ViewCount) AS ViewSum 
     FROM ... ) r1

*请参阅精确说明这一点的第 3 和第 4 条评论。


推荐阅读