sql多次计数

时间:2010-10-22 14:43:17

标签: sql

我有3个表,其中第一个主键是另一个表中的外键。

我想从第一个表中提取一个字段,然后从另一个表中提取一个字数,所有字段都使用pk和fk连接。这就是我到目前为止所做的:

SELECT MBDDX_STUDY.STUDY_NAME, COUNT(MBDDX_EXPERIMENT.STUDY_ID) AS NUMBER_OF_EXPERIMENTS
FROM MBDDX_STUDY
INNER JOIN MBDDX_EXPERIMENT
ON MBDDX_STUDY.ID=MBDDX_EXPERIMENT.STUDY_ID 
INNER JOIN (SELECT COUNT(MBDDX_TREATMENT_GROUP.GROUP_NO) AS NUMBER_OF_GROUPS 
FROM MBDDX_TREATMENT_GROUP) 
ON MBDDX_TREATMENT_GROUP.STUDY_ID = MBDDX_STUDY.ID
group by MBDDX_STUDY.STUDY_NAME, MBDDX_TREATMENT_GROUP.STUDY_ID

但是,我得到一个错误,说倒数第二行中的MBDDX_TREATMENT_GROUP.STUDY_ID是无效的标识符。这是一张正确的表格。

请提出任何建议。

感谢。

6 个答案:

答案 0 :(得分:2)

您收到错误是因为该列不在SELECT中,因此它不能GROUP BY它没有的字段。

答案 1 :(得分:0)

您无需按此字段进行分组(MBDDX_TREATMENT_GROUP.STUDY_ID)。它应该只是group by MBDDX_STUDY.STUDY_NAME

答案 2 :(得分:0)

如果我的理解是正确的,你需要第一张表中的记录,并在其他两张表中记录相关记录。这就是答案

SQL:Getting count from many tables for a user record in USER table.Whats the best approach?

答案 3 :(得分:0)

看起来您需要为第二个子查询添加别名,并且需要包含要加入的内容。

看起来你也没有使用子查询中的count。 试试这个:

SELECT MBDDX_STUDY.STUDY_NAME
, COUNT(MBDDX_EXPERIMENT.STUDY_ID) AS NUMBER_OF_EXPERIMENTS 
FROM MBDDX_STUDY 
INNER JOIN MBDDX_EXPERIMENT 
ON MBDDX_STUDY.ID=MBDDX_EXPERIMENT.STUDY_ID 
INNER JOIN (SELECT STUDY_ID, COUNT(MBDDX_TREATMENT_GROUP.GROUP_NO) AS NUMBER_OF_GROUPS 
            FROM MBDDX_TREATMENT_GROUP GROUP BY MBDDX_TREATMENT_GROUP.STUDY_ID) xx 
ON xx.STUDY_ID = MBDDX_STUDY.ID 
GROUP BY MBDDX_STUDY.STUDY_NAME, xx.STUDY_ID

答案 4 :(得分:0)

子查询语法似乎对我没有任何意义。您创建了一个查询计算MBDDX_TREATMENT_GROUP的所有行的查询,独立于STUDY_ID,然后尝试将其连接到表中,其连接条件不引用子查询结果中的任何内容(并且不能,没有别名)。

为什么不使用简单的连接?假设MBDDX_EXPERIMENT还有一个主键ID,您可以使用COUNT-DISTINCT执行此操作:

SELECT
    MBDDX_STUDY.ID, MBDDX_STUDY.STUDY_NAME,
    COUNT(DISTINCT MBDDX_EXPERIMENT.ID) AS NUMBER_OF_EXPERIMENTS
    COUNT(DISTINCT MBDDX_TREATMENT_GROUP.GROUP_NO) AS NUMBER_OF_GROUPS
FROM
    MBDDX_STUDY
    INNER JOIN MBDDX_EXPERIMENT ON MBDDX_EXPERIMENT.STUDY_ID=MBDDX_STUDY.ID
    INNER JOIN MBDDX_TREATMENT_GROUP ON MBDDX_TREATMENT_GROUP.STUDY_ID=MBDDX_STUDY.ID
GROUP BY
    MBDDX_STUDY.ID, MBDDX_STUDY.STUDY_NAME

(MBDDX_STUDY.STUDY_NAME在技术上不应该根据ANSI SQL包含在GROUP BY表达式中,因为它对STUDY_ID具有功能依赖性。但是在Oracle上是必要的,它无法发现依赖关系。)< / p>

答案 5 :(得分:0)

对于你真正想做的事,你需要OUTER JOIN s。

WITH   number_of_experiments
AS     ( SELECT study_id
              , count ( * ) CNT
           FROM MBDDX_EXPERIMENT
          group by study_id )
     , number_of_groups
as     ( select study_id
              , count ( * ) CNT
           FROM mbddx_treatment_group
          group by study_id )
select study_name
     , coalesce(noex.cnt,0)
     , coalesce(notr.cnt,0)
  from mbddx_study
 outer join number_of_experiments
as     noex
 using ( study_id )
 outer join number_of_groups
as     nogr
 using ( study_id )