SQL查询返回汇总和非汇总结果

问题描述

遵循以下几行的查询应该可以帮助您入门:

select s.name
     , s.weight
     , ((s.weight/st.avgweight) * 100) as weight_apgaw
     , ((s.height/st.avgheight) * 100) as weight_aphei
from student s 
join (
   select grp_id
        , avg(weight) as avgweight
        , avg(height) as avgheight
   from student
   group by grp_id
   ) st on s.grp_id = st.grp_id

解决方法

我需要编写一个查询,该查询从表中返回汇总和非汇总数据。

下面的示例应有助于阐明我要执行的操作。我有以下(简化)表:

CREATE TABLE course_group_def (
          id        PRIMARY SERIAL KEY,name      TEXT NOT NULL
          );

CREATE TABLE student (
          id        PRIMARY SERIAL KEY,grp_id    INTEGER REFERENCES course_group_def(id) ON UPDATE CASCADE,name      TEXT NOT NULL,weight    float NOT NULL,height    float NOT NULL
          );

为了便于讨论,假设每个学生都属于一个课程组。我想编写一个查询,该查询将返回如下结果集:

student.name,student.weight,weight_apgaw,weight_apgh

在哪里:

weight_apgaw: 是单个学生的体重,表示为他/她所属课程组平均体重的百分比。

weight_apgh: 是单个学生的体重,表示为他/她所属课程组平均身高的百分比

我对如何编写这样的查询一无所知。我的方法是编写两个查询,并以某种方式在两个表之间进行查找-但是这种方法充其量似乎是荒谬的且效率低下的。

有人可以建议我如何正确编写这样的SQL函数吗?理想情况下,这应该是与数据库无关的。但是,我使用的是PostgreSQL
8.4,因此如果必须在SQL风格之间进行选择,则应优先考虑。