sql - 条件聚合查询没有给出正确的输出
问题描述
我正在尝试使用条件聚合找到平均值。我在 SQL 中有 2 个表,如下所示
租赁扩展表:
租借物品 ID | 延期日期 | ExtensionBy_UserID |
---|---|---|
7 | 2020-07-27 | 10 |
1 | 2020-07-28 | 7 |
用户表包含选择查询中列出的属性
select UserID, fname, lname, JobTitle,
(
select avg(case when ExtensionBy_UserID = 10 then 1.0 else 0 end) as OrderExtended
from RentalExtensions
where ExtensionBy_UserID=userID
) as ExtensionRate
from [user]
where userID = 10
当我运行上面的查询时,我得到 UserID=10 的 Extension Rate 为 1.00,UserID=7 为 0.00。这不是正确的输出。当我运行下面的查询时,它为 userID=10 提供了 0.500 的正确输出,这就是我希望顶部查询显示的内容。如果我能得到两个用户的平均值,那就更好了。
select avg(case when ExtensionBy_UserID = 10 then 1.0 else 0 end) as OrderExtended
from RentalExtensions
对我哪里出错有帮助吗?
解决方案
@GordonLinoff 几乎是对的。
您不能直接在嵌套查询的聚合函数中使用外部引用(原因我不清楚)。
因此,您需要将该外部引用放入内部查询的主体中。
我们可以做到这一点CROSS APPLY (VALUES(
select
UserID,
fname,
lname,
JobTitle,
(select
avg(case when re.ExtensionBy_UserID = v.userId then 1.0 else 0 end)
from RentalExtensions re
cross apply (values (u.userId) ) v(userId)
) as ExtensionRate
from [user]
where userID =10
编辑:您在评论中说您实际上想要整张user
桌子。
所以最好只使用普通join
/group by
设置,窗口聚合:
select
UserID,
fname,
lname,
JobTitle,
count(*) as CountOfExtenstions,
count(*) * 1.0 / count(count(*)) over () as ExtensionRate
from [user]
join RentalExtensions re on re.ExtensionBy_UserID = v.userId
group by userID;
推荐阅读
- angular - JHipster 4.14.1:输入类型="datetime-local" 未绑定
- javascript - 重置应用于日历单元格的 css 类
- python - 如何从python中的docker容器获取文件
- javascript - 在调整大小时将图像高度应用于 Div
- python - 如何从另一个文件设置另一个文件上的字典的值?
- vba - 如何使用 vba 脚本检查 MS Word 页边距?
- mysql - Mysql返回所有部门的所有状态计数如果为null则返回0
- visual-studio-2017 - Visual Studio 2017 在代码编辑器中没有背景
- java - 无法启动 Nifi JAVA_HOME 无效或权限被拒绝错误
- angularjs - 没有得到对 html 视图页面的响应