我们假设我有一个名为患者的表格,在此表格中有一个年龄列。我想知道谁 最年长的患者,最年轻的患者以及他们中的平均年龄。
所以,鉴于表格:
患者
姓名:文字
年龄:整数
为此,我正在做:
select name, age from patients
where age = (select max(age) as 'HighestAges' from patients)
group by name;
通过这种方式,我能够找回每个患有更高年龄的患者(如果结果中年龄相同的患者不止一个)。
嗯,我需要做的只是改变聚合函数,我会得到预期的结果,对吧?所以我做了:
select name, age from patients
where age = (select min(age) as 'LowestAges' from patients)
group by name;
我找回了年龄最小的病人。
我只选择平均年龄而已:
select avg(age) as 'AverageAge' from patients;
到目前为止一切顺利,现在这里有一个大问题:如何在单个结果集中显示这3个查询的结果?
我想要实现的是这样的结果集:
Name HighestAges Name LowestAges AverageAge
Rosemary 62 Tomalino 22 42
Mat 62 Rocat 22 42
你可能在想"这是多么愚蠢的结果?"你是对的,它看似愚蠢,这就是我想要做的原因,因为它很愚蠢而没有人会这样做。我知道可能有数以千计的方法,我想听(读)所有的想法。我只是为了好玩而这样做,我正在学习SQL,所以我没有过时。我学到了很多关于完全加入,外连接,内连接和自联接的知识,我已经尝试了大约2天完成这些工作,但是我自己无法完成这些工作,所以我'寻求帮助。
提前谢谢。
答案 0 :(得分:0)
您可以通过多种方式完成此操作。通过将=
子查询移动到from
子句,可以使用以下方法构建查询:
select p.name, p.age, maxage, minage, avgage
from patients p cross join
(select max(age) as maxage, min(age) as minage, avg(age) as avgage
from patients
) pp
where age in (maxage, minage);
答案 1 :(得分:0)
这个怎么样?该解决方案返回"最高 - 最低"。
的所有组合ViewportLayer
答案 2 :(得分:0)
一种更简单的方法是使用CTE和交叉连接
;with cte1 as (
select * from patients where age = (
select min(age) from patients )
), cte2 as (
select * from patients where age = (
select max(age) from patients )
), cte3 as (
select avg(age) avgAge from patients)
select c1.name, c1.age as MinAge, c2.name, c2.age as MaxAge, c3.avgAge from cte1 c1 cross join cte2 c2
cross join cte3 c3