Я никогда не беспокоюсь о создании с помощью своего собственного регулярного выражения, потому что есть вероятность, что кто-то еще придумал лучшую версию. Я всегда использую regexlib , чтобы найти его по своему вкусу.
Вы должны поместить все столбцы SELECT
в GROUP BY
или использовать на них функции, которые сжимают результаты до одного значения (например, MIN
, MAX
или SUM
).
Простой пример, чтобы понять, почему это происходит: представьте, что у вас есть такая база данных:
FOO BAR
0 A
0 B
и вы запускаете SELECT * FROM table GROUP BY foo
. Это означает, что база данных должна возвращать одну строку в качестве результата с первым столбцом 0
, чтобы выполнить GROUP BY
, но теперь есть два значения bar
. Какой результат вы ожидаете - A
или B
? Или должна ли база данных возвращать более одной строки, нарушая контракт GROUP BY
?
Группа by используется для агрегирования некоторых данных, в зависимости от агрегатной функции, и кроме этого вам нужно поместить столбец или столбцы, для которых вам нужна группировка.
например:
select d.deptno, max(e.sal)
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno;
Это приведет к максимальной заработной плате отделов.
Теперь, если мы опустим d.deptno
из предложения group by, она даст ту же ошибку.
Если вы выполняете поиск в силу предложения GROUP BY
, любое выражение в SELECT
, которое не является групповой функцией (или агрегатной функцией или агрегированной колонкой), например COUNT
, AVG
, MIN
, MAX
, SUM
и т. д. ( Список функций агрегации ) должен присутствовать в GROUP BY
.
Пример (правильный путь) (здесь employee_id
негрупповая функция (неагрегированный столбец), поэтому в GROUP BY
появляется . Напротив, сумма (зарплата) представляет собой групповую функцию (агрегированный столбец), поэтому не требуется появляться в GROUP BY
.
SELECT employee_id, sum(salary)
FROM employees
GROUP BY employee_id;
Пример (неправильный путь) (здесь employee_id
не является групповой функцией и не появляется в предложении GROUP BY
, что приведет к ошибке ORA-00979 .
SELECT employee_id, sum(salary)
FROM employees;
Чтобы исправить, вам нужно сделать one из следующего:
SELECT
в разделе GROUP BY
SELECT
. Вы должны сделать следующее:
SELECT cr.review_sk,
cr.cs_sk,
cr.full_name,
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
cs.cs_id,
cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
and row_delete_date_time is null
and cr.review_sk = cf.review_wk (+)
and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;
Слишком плохо Oracle имеет такие ограничения. Конечно, результат для столбца, не входящего в GROUP BY, будет случайным, но иногда вы этого хотите. Глубокий Oracle, вы можете сделать это в MySQL / MSSQL.
НО есть работа для Oracle:
Пока следующая строка не работает
SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;
Вы можете обмануть Oracle с некоторыми 0, как показано ниже, чтобы сохранить свой столбец в области видимости, но не группировать его (предполагая, что это числа, в противном случае использовать CONCAT)
SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A);
Включить в GROUP BY
предложение все SELECT
выражения, которые не являются аргументами групповой функции.
Такая же ошибка также возникает, когда ключевое слово UPPER или LOWER не используется в обоих случаях в выражении select и group по выражению.
Неверно: -
select a , count(*) from my_table group by UPPER(a) .
Вправо: -
select UPPER(a) , count(*) from my_table group by UPPER(a) .