sql - 在 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
解决方案
您不能在定义它的同一查询中使用 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 条评论。
推荐阅读
- javascript - 在 html body onload 中读取模型属性
- github - 如何为 Github Action 提供文件内容作为输入?
- spring - 如何在 Spring + Thymeleaf 中获取选定值以输入值(作为对象)?
- python - 单击不检测组中的命令
- odoo - Odoo 产品搜索 to_date 不正确
- java - 使用thymeleaf从spring mvc应用程序中的数据库生成html选择选项
- webrtc - 服务器端实时分析来自客户端的视频流
- linux - 如何在一段时间内制作具有特定大小的文件?
- c# - ASP.NET Core 授权不适用于嵌套角色
- ssis - 使用 ssis 派生列表达式根据任何给定日期计算下周三