如何在同一个查询中加入不同聚合函数的结果?

时间:2016-06-27 01:11:36

标签: sql sql-server database tsql

我们假设我有一个名为患者的表格,在此表格中有一个年龄列。我想知道谁 最年长的患者,最年轻的患者以及他们中的平均年龄。

所以,鉴于表格:

患者 姓名:文字
年龄:整数

  1. 谁是db中最老的病人?
  2. 为此,我正在做:

    select name, age from patients
    where age = (select max(age) as 'HighestAges' from patients)
    group by name;
    

    通过这种方式,我能够找回每个患有更高年龄的患者(如果结果中年龄相同的患者不止一个)。

    1. 谁是最年轻的病人?
    2. 嗯,我需要做的只是改变聚合函数,我会得到预期的结果,对吧?所以我做了:

      select name, age from patients
      where age = (select min(age) as 'LowestAges' from patients)
      group by name;
      

      我找回了年龄最小的病人。

      1. 所有患者的平均年龄是多少?
      2. 我只选择平均年龄而已:

        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天完成这些工作,但是我自己无法完成这些工作,所以我'寻求帮助。

        提前谢谢。

3 个答案:

答案 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