2011-05-26 29 views
1

快速背景 - 我需要找出通过我们公司实验室按案例类型和月份分组的案例的终止率。到目前为止,我想出了这个:在使用Oracle的子查询中出现奇怪的'GROUP BY'错误

SELECT BPI.TYPE, 
     EXTRACT(MONTH FROM CS.RECEIVED_DATE) MONTH, 
     COUNT(*) termed_cases 
    FROM CELL_SOURCE cs 
    JOIN BASIC_PATHOLOGY_INFO bpi ON CS.CELL_SOURCE_ID = BPI.CELL_SOURCE_ID 
    JOIN RECENT_CELL_SOURCE_STATUS rcss ON CS.CELL_SOURCE_ID = RCSS.CELL_SOURCE_ID 
WHERE type IS NOT NULL 
    AND CS.RECEIVED_DATE > to_date('03/01/2011', 'MM/DD/YYYY/') 
    AND RCSS.STATUS like 'Term%' 
GROUP BY BPI.TYPE, EXTRACT(MONTH FROM CS.RECEIVED_DATE) 
ORDER BY month, type 

这找到所有已被称为,很容易的情况。但是,当我想要查找费率时,我遇到了一些问题。我试图用一个子查询捉每类案件的总量不管它的地位,因为这样的:

COUNT(*)/(SELECT COUNT(*) 
      FROM CELL_SOURCE cs_1 
      JOIN BASIC_PATHOLOGY_INFO bpi_1 ON CS_1.CELL_SOURCE_ID = BPI_1.CELL_SOURCE_ID 
      WHERE BPI_1.TYPE = BPI.TYPE 
      AND EXTRACT(month from CS_1.RECEIVED_DATE) = EXTRACT(MONTH FROM CS.RECEIVED_DATE)) termed_cases 

然而,这引发ORA-00979: not a GROUP BY expression错误,并从子查询凸显BPI.TYPE

任何人都知道我的错误实际上可能是什么?此外,分析函数在这里比集合函数更好吗?

+0

您需要按子查询中的BPI_1.TYPE进行分组 – reggie 2011-05-26 14:47:42

+0

select子句中的“BPI.TYPE”是否真的应该是“BPI.TUMOR_TYPE”,就像您在组中所做的一样? – Craig 2011-05-26 14:49:01

+0

对不起,只是输入。肿瘤类型完全不同 - 弗洛伊德错误 – ryebr3ad 2011-05-26 14:54:07

回答

4

所以,你需要两个计数:一个月内所有病例的总数,以及Termed病例的总数。这样做的最简单的方法是使用CASE()函数来执行条件计数,像这样:

SELECT BPI.TYPE, 
     EXTRACT(MONTH FROM CS.RECEIVED_DATE) MONTH, 
     COUNT(*) all_cases, 
     sum(case when RCSS.STATUS like 'Term%' then 1 else 0 end) termed_cases 
    FROM CELL_SOURCE cs 
    JOIN BASIC_PATHOLOGY_INFO bpi ON CS.CELL_SOURCE_ID = BPI.CELL_SOURCE_ID 
    JOIN RECENT_CELL_SOURCE_STATUS rcss ON CS.CELL_SOURCE_ID = RCSS.CELL_SOURCE_ID 
WHERE tumor_type IS NOT NULL 
    AND CS.RECEIVED_DATE > to_date('03/01/2011', 'MM/DD/YYYY/') 
GROUP BY BPI.TUMOR_TYPE, EXTRACT(MONTH FROM CS.RECEIVED_DATE) 
ORDER BY month, tumor_type 

注意,我已删除的WHERE子句的LIKE过滤器。

+0

两种计数是如此除以另一种 – 2011-05-26 14:55:21

+0

太棒了,这正是我需要的答案。 Jeeze,即使拥有CS学位,我仍然对此感到困惑。谢谢您的帮助。 – ryebr3ad 2011-05-26 15:00:25

0
select bpi.type , month, 
     termed_cases/
    (select count(*) 
    from CELL_SOURCE cs_1 
    inner join BASIC_PATHOLOGY_INFO bpi_1 
     on CS_1.CELL_SOURCE_ID = BPI_1.CELL_SOURCE_ID 
    where BPI_1.TUMOR_TYPE = BPI.TUMOR_TYPE 
    and extract(month from CS_1.RECEIVED_DATE) = extract(MONTH FROM CS.RECEIVED_DATE) 
    ) 
from (
select BPI.TYPE, 
extract(MONTH FROM CS.RECEIVED_DATE) MONTH, 
count(*) termed_cases 
from CELL_SOURCE cs 
inner join BASIC_PATHOLOGY_INFO bpi 
    on CS.CELL_SOURCE_ID = BPI.CELL_SOURCE_ID 
inner join RECENT_CELL_SOURCE_STATUS rcss 
    on CS.CELL_SOURCE_ID = RCSS.CELL_SOURCE_ID 
where tumor_type is not null 
and CS.RECEIVED_DATE > to_date('03/01/2011', 'MM/DD/YYYY/') 
and RCSS.STATUS like 'Term%' 
group by BPI.TYPE, extract(MONTH FROM CS.RECEIVED_DATE) 
) 
order by month, type