我正在努力处理一个我最初认为应该非常简单的SQL查询。
想象一个表Users
使用UserID
作为PK,使用列Age
表示用户年龄:
UserID Age
1 22
2 34
3 23
4 19
etc.
我希望能够指定UserID并返回该用户的年龄以及所有其他用户的平均年龄。例如,如果我指定UserID 1,那么我希望将返回集设置为:
UserID Age AvgAge
1 22 24.5
以下内容不起作用:( WHERE
之前执行GROUP BY
)
Select UserID, Age, Avg(Age) as 'AvgAge'
From Users
Where UserID = 1
Group By UserId, Age
UserID Age AvgAge //Result set
1 22 22
有人能把我推向正确的方向吗?
顺便说一句,在一个理想的世界中,平均年龄应该不包括被指定为用户的想法是显示他们相对于其他人的平均年龄的年龄。
鉴于有1000多名用户,然后对所有用户取平均值对AvgAge
数字没有实际差别,但是如果有人想用他们的解决方案来展示他们的SQL实力那么我'有兴趣看到它。
由于
答案 0 :(得分:3)
declare @T table
(
UserID int,
Age int
)
insert into @T values
(1, 22),
(2, 34),
(3, 23),
(4, 19)
declare @UserID int = 1
select Age, (select avg(Age*1.0)
from @T
where UserID <> @UserID) as AvgAge
from @T
where UserID = @UserID
结果:
Age AvgAge
----------- ---------------------------------------
22 25.333333
答案 1 :(得分:2)
此查询根据请求从平均值中排除具有指定ID的用户。你在你的例子中使用了MAX,这不会给你平均值,但如果MAX实际上是你想要的,你可以在这个查询中用AVG交换它,它会起作用。
SELECT u.UserID,
u.Age,
(SELECT AVG(uavg.Age)
FROM Users uavg
WHERE uavg.UserID != u.UserID) AS AvgAge
FROM Users u
WHERE u.UserID = 1
答案 2 :(得分:1)
使用您需要的avg
表示平均值,max
表示最大年龄:
Select
UserID,
Age,
(select Max(Age) from Users) as 'AvgAge'
From Users
Where UserID = 1
答案 3 :(得分:1)
SELECT
u.UserId,
u.Age,
b.AvgAge
FROM
dbo.Users a,
(SELECT AVG(Age*1e0) as AvgAge FROM dbo.Users) as b
答案 4 :(得分:1)
Select U.UserID, u.Age, sq.Age as 'AvgAge'
From Users u
join (select average(age) as Age from users) sq on 1=1
Where UserID = 1
Group By UserId, Age
答案 5 :(得分:1)
declare @T table (UserID int, Age int)
insert into @T values(1,22),(2,34),(3,23),(4,19)
declare @UserID int = 1
;with a as
(
select userid, Age,
avg(age * case when userid <> @userid then 1.0 end) over() 'AvgAge'
from @T
)
select Age, AvgAge from a
where userid = @UserID