2011-05-26 27 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