问题描述
|
使用Oracle10g。我在GROUP BY子句中使用\“ case when \”。问题是当我使用时:
a.book_name IN (SELECT BOOK
FROM BOOK_CONF)
这不是一个GROUP BY子句。有人可以帮我吗?
SELECT pub_name,CASE
WHEN a.book_name IN (SELECT BOOK FROM BOOK_CONF) THEN \'UNI\'
WHEN a.book_name =\'JAVA\' THEN \'JAVA\'
ELSE \'MIS\'
END) test,COUNT(*)
FROM books a
GROUP BY pub_name,CASE
WHEN a.book_name in (SELECT BOOK FROM BOOK_CONF) THEN \'UNI\'
WHEN a.book_name =\'JAVA\' THEN \'JAVA\'
ELSE \'MIS\'
解决方法
最早的Oracle允许引用列别名为
ORDER BY
-否则将得到ORA-00904:无效标识符(IME最多为10g,包括10g-如果在11g中更改,则为dunno)。因此,最简单的解决方法是使用派生表/内联视图:
SELECT x.pub_name,x.test,COUNT(*)
FROM (SELECT a.pub_name,CASE
WHEN a.book_name IN (SELECT BOOK FROM BOOK_CONF) THEN \'UNI\'
WHEN a.book_name =\'JAVA\' THEN \'JAVA\'
ELSE \'MIS\'
END AS test
FROM BOOKS a) x
GROUP BY x.pub_name,x.test
,请允许我总结一下,因为这里混合了一些好的和坏的建议。
首先,您的表带有一些示例数据:
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
这不是因为在group by子句中不允许使用CASE表达式。这是因为您正在GROUP BY子句中使用SELECT语句。如果将\“ 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,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使用正确的方法,将表达式中的group封装在内联视图中:
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.
希望这可以帮助。
问候,
抢。
,select pub_name,(CASE WHEN a.book_name in(SELECT BOOK FROM BOOK_CONF) THEN \'UNI\'
WHEN a.book_name =\'JAVA\' THEN \'JAVA\' ELSE \'MIS\' END) AS test,count(*) from books a group by pub_name,test;
我相信您没有在group by子句中包含测试。让我知道是否可行
,由于a.book_name是您要在案例中测试的内容,因此您应该在分组依据中使用以下内容:
select a.pub_name,(CASE WHEN a.book_name in (SELECT BOOK FROM BOOK_CONF) THEN \'UNI\'
WHEN a.book_name =\'JAVA\' THEN \'JAVA\'
ELSE \'MIS\'
END) test,count(*)
from books a
group by a.pub_name,a.book_name