Нечетная ошибка 'GROUP BY' в подзапросе при использовании Oracle - PullRequest
1 голос
/ 26 мая 2011

Краткий обзор - мне нужно найти показатели завершения дел, проходящих через нашу лабораторию, сгруппированные по типу дел и месяцам.До сих пор я придумал это:

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 изподзапрос.

Кто-нибудь имеет какие-либо идеи, что моя ошибка может быть на самом деле?Кроме того, аналитическая функция будет работать здесь лучше, чем агрегатная функция?

Ответы [ 2 ]

4 голосов
/ 26 мая 2011

Итак, вам нужно два счета: общее количество для всех случаев в месяце и общее количество только для срочных случаев. Самый простой способ сделать это - использовать функцию 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

Обратите внимание, что я удалил фильтр LIKE из предложения WHERE.

0 голосов
/ 26 мая 2011
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
...