【问题标题】:Odd 'GROUP BY' error in a sub-query while using Oracle使用 Oracle 时子查询中出现奇怪的“GROUP BY”错误
【发布时间】:2011-09-02 16:23:16
【问题描述】:

简要介绍一下背景——我需要找到通过我们公司实验室的案例的终止率,这些案例按案例类型和月份分组。到目前为止,我想出了这个:

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

有人知道我的错误实际上是什么吗?另外,分析函数在这里会比聚合函数更好吗?

【问题讨论】:

  • 您需要在子查询中按 BPI_1.TYPE 分组
  • select 子句中的“BPI.TYPE”真的应该是“BPI.TUMOR_TYPE”吗,就像您在 group by 中一样?
  • 对不起,只是输入。肿瘤类型完全不同——弗洛伊德的错别字

标签: sql oracle ora-00979


【解决方案1】:

因此,您需要计算两个数据:当月所有案例的总数和仅对 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 过滤器。

【讨论】:

  • 这两个计数是一个除以另一个
  • 太棒了,这正是我需要的答案。天哪,即使拥有计算机科学学位,我仍然对这些东西感到困惑。感谢您的帮助。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2012-04-02
    • 2023-04-04
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多