关于按组-Oracle 10g

问题描述

| 使用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