首页 > 解决方案 > 条件聚合查询没有给出正确的输出

问题描述

我正在尝试使用条件聚合找到平均值。我在 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

对我哪里出错有帮助吗?

标签: sqlsql-servertsql

解决方案


@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;

推荐阅读