首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要在Oracle中跨多层嵌套SQL查询查找平均值

需要在Oracle中跨多层嵌套SQL查询查找平均值
EN

Stack Overflow用户
提问于 2011-11-22 18:42:23
回答 1查看 977关注 0票数 1

这是一个有点混乱,可能有一些更好的方法,但我们只是需要一些信息,一些报告,我们正在进行的工作。

因此,我们有许多项目;每个项目都有一组任务,每个任务都有一个与其关联的文档类型ID。项目可以属于一个或多个工作组。

我们希望分析至少有一个文档类型为x的任务的项目,然后查看它有多少工作组。我可以这样做:

代码语言:javascript
复制
   select distinct T.PROJECTID,
      (select COUNT(*) from TPM_PROJECTWORKGROUPS where PROJECTID=T.PROJECTID) as NumWorkgroups
   from TPM_TASK T
   where T.DOCUMENTTYPEID=17

现在,我们希望看到这些项目中工作组的平均数量。所以我可以:

代码语言:javascript
复制
select AVG(NumWorkgroups) FROM (
   select distinct T.PROJECTID,
      (select COUNT(*) from TPM_PROJECTWORKGROUPS where PROJECTID=T.PROJECTID) as NumWorkgroups
   from TPM_TASK T
   where T.DOCUMENTTYPEID=17
)

但是,我们希望在所有文档类型中运行相同的查询(大约有200个文档类型)。如果不复制和粘贴查询200次,我就无法找到这样的方法。我试过:

代码语言:javascript
复制
select DOCUMENTTYPEID, 
    (select AVG(NumWorkgroups) FROM (
       select distinct T.PROJECTID,
          (select COUNT(*) from TPM_PROJECTWORKGROUPS where PROJECTID=T.PROJECTID) as NumWorkgroups
       from TPM_TASK T
       where T.DOCUMENTTYPEID=DT.DOCUMENTTYPEID
    ))
from TPM_DOCUMENTTYPE DT

但是,我得到了错误:

代码语言:javascript
复制
ORA-00904: "TPM_DOCUMENTTYPE"."DOCUMENTTYPEID": invalid identifier

我相信,因为DT超出了嵌套查询中的多个级别。有更好的方法来执行这个查询吗?

贾斯汀的更新:

下面是一个示例模式:

代码语言:javascript
复制
create table Test_Projects (
  id   number primary key
)

create table Test_Tasks (
  id   number primary key,
  project number,
  doctype number
)

create table Test_Workgroups (
  id   number primary key,
  workgroup number,
  project number
)

通过一些样本数据:

代码语言:javascript
复制
insert into Test_Projects VALUES (1) --Create projects 1 and 2
insert into Test_Projects VALUES (2)
insert into Test_Tasks VALUES (1, 1, 5) --Project 1 has two tasks, doc types 5 and 6
insert into Test_Tasks VALUES (2, 1, 6)
insert into Test_Tasks VALUES (3, 2, 6) --Project 2 has one task, doc type 6
insert into Test_Workgroups VALUES (1, 1, 1) --Project 1 belongs to workgroups 1 and 2
insert into Test_Workgroups VALUES (2, 2, 1)
insert into Test_Workgroups VALUES (3, 2, 2) --Project 2 belongs to workgroup 2

我们需要知道具有x类型任务的项目所属的工作组的平均数量。

例如,doc类型5只有两个工作组的项目1,因此平均为2个。Doc 6有2个项目(1和2 )--1有2个工作组,2个有一个工作组--因此平均为1.5。

我们需要列出所有文档类型和每个工作组的平均数量。

我希望这个查询返回:

代码语言:javascript
复制
DOCTYPE     AverageWorkgroups
-------     -----------------
5           2
6           1.5
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-22 19:03:02

谢谢你提供的样本数据。这样就更清楚了。

我相信这可以实现您想要的结果(我还计算了输出中的项目数和工作组数,因为这使我的测试更容易)

代码语言:javascript
复制
SQL> ed
Wrote file afiedt.buf

  1  select t.doctype,
  2         count(distinct p.id) numProjects,
  3         count(*) numWorkgroups,
  4         count(*)/ count( distinct p.id) avgNumWorkgroups
  5    from test_projects p,
  6         test_tasks    t,
  7         test_workgroups w
  8   where p.id = t.project
  9     and p.id = w.project
 10*  group by t.doctype
SQL> /

   DOCTYPE NUMPROJECTS NUMWORKGROUPS AVGNUMWORKGROUPS
---------- ----------- ------------- ----------------
         6           2             3              1.5
         5           1             2                2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8232043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档