Пожалуйста, позвольте мне подвести итог, потому что здесь есть несколько хороших и плохих советов, смешанных вместе.
Сначала ваши таблицы с некоторыми примерами данных:
SQL> create table books (book_name,pub_name)
2 as
3 select 'JAVA', 'PUB1' from dual union all
4 select 'JAVA', 'PUB2' from dual union all
5 select 'ABC', 'PUB1' from dual union all
6 select 'XYZ', 'PUB3' from dual union all
7 select 'KLM', 'PUB3' from dual
8 /
Table created.
SQL> create table book_conf (book)
2 as
3 select 'XYZ' from dual union all
4 select 'KLM' from dual
5 /
Table created.
Ваш запрос:
SQL> SELECT pub_name
2 , CASE
3 WHEN a.book_name IN (SELECT BOOK FROM BOOK_CONF) THEN
4 'UNI'
5 WHEN a.book_name ='JAVA' THEN
6 'JAVA'
7 ELSE
8 'MIS'
9 END test
10 , COUNT(*)
11 FROM books a
12 GROUP BY pub_name
13 , CASE
14 WHEN a.book_name in (SELECT BOOK FROM BOOK_CONF) THEN
15 'UNI'
16 WHEN a.book_name ='JAVA' THEN
17 'JAVA'
18 ELSE
19 'MIS'
20 END
21 /
WHEN a.book_name IN (SELECT BOOK FROM BOOK_CONF) THEN
*
ERROR at line 3:
ORA-00979: not a GROUP BY expression
Это НЕ потому, что выражение CASE недопустимо в выражении group by.Это потому, что вы используете оператор SELECT в вашем предложении GROUP BY.Если вы замените «IN (SELECT book FROM book_conf)» на «IN ('XYZ', 'KLM')", вы увидите, что ваш оператор теперь успешно выполняется:
SQL> SELECT pub_name
2 , CASE
3 WHEN a.book_name IN ('XYZ','KLM') THEN
4 'UNI'
5 WHEN a.book_name ='JAVA' THEN
6 'JAVA'
7 ELSE
8 'MIS'
9 END test
10 , COUNT(*)
11 FROM books a
12 GROUP BY pub_name
13 , CASE
14 WHEN a.book_name in ('XYZ','KLM') THEN
15 'UNI'
16 WHEN a.book_name ='JAVA' THEN
17 'JAVA'
18 ELSE
19 'MIS'
20 END
21 /
PUB_ TEST COUNT(*)
---- ---- ----------
PUB1 MIS 1
PUB1 JAVA 1
PUB2 JAVA 1
PUB3 UNI 2
4 rows selected.
Запрос ниже выглядитотлично, не выдает ошибку, но дает другой результат, потому что теперь вы группируете по book_name вместо вашего выражения CASE:
SQL> select a.pub_name
2 , (CASE WHEN a.book_name in (SELECT BOOK FROM BOOK_CONF) THEN 'UNI'
3 WHEN a.book_name ='JAVA' THEN 'JAVA'
4 ELSE 'MIS'
5 END) test
6 , count(*)
7 from books a
8 group by a.pub_name
9 , a.book_name
10 /
PUB_ TEST COUNT(*)
---- ---- ----------
PUB1 MIS 1
PUB1 JAVA 1
PUB2 JAVA 1
PUB3 UNI 1
PUB3 UNI 1
5 rows selected.
OMG Ponies использует правильный подход, инкапсулируя группу выражением ввстроенный вид:
SQL> select pub_name
2 , book_type
3 , count(*)
4 from ( select pub_name
5 , case
6 when book_name in (select book from book_conf) then
7 'UNI'
8 when book_name = 'JAVA' then
9 'JAVA'
10 else
11 'MIS'
12 end book_type
13 from books
14 )
15 group by pub_name
16 , book_type
17 /
PUB_ BOOK COUNT(*)
---- ---- ----------
PUB1 MIS 1
PUB1 JAVA 1
PUB2 JAVA 1
PUB3 UNI 2
4 rows selected.
Надеюсь, это поможет.
С уважением,
Роб.