2014-04-04 5 views
0

오라클 SQL 쿼리를 작성하려고합니다. 그 값이 1보다 크면 그룹을 구성하는 행과 함께 행을 그룹화 할 것입니다. 아래를 참조하십시오. 예를 들어, 그룹화를 수행하는 SQL 조회. 어떤 도움이나 제안이라도 대단히 감사하겠습니다.Oracle SQL - 그룹 및 세부 레코드

SELECT NULL id, name, NULL author, count(author) "count" 
FROM myTable 
GROUP BY name 

을 더한 후 더가 상세 : 저자의 카운트 이름으로 그룹화

====================== 
ID | NAME | AUTHOR 
====================== 
2 | Abc | John 
6 | Abc | John 
3 | Xyz | Mike 
4 | Abc | Mike 
5 | Xyz | John 
1 | Abc | Mike 
7 | PQR | Raj 


Expected Result - 
=========================== 
ID | NAME | AUTHOR | COUNT 
=========================== 
    | Abc |  | 4 
2 | Abc | John |  
6 | Abc | John |  
4 | Abc | Mike |  
1 | Abc | Mike |  
    | PQR |  | 1 
    | Xyz |  | 2 
3 | Xyz | Mike |  
5 | Xyz | John |  


SELECT NAME, COUNT(NAME) from (
SELECT 2 as ID, ' Abc ' as NAME, ' John ' as AUTHOR FROM DUAL 
UNION 
SELECT 6 as ID, ' Abc ' as NAME, ' John ' as AUTHOR FROM DUAL 
UNION 
SELECT 3 as ID, ' Xyz ' as NAME, ' Mike ' as AUTHOR FROM DUAL 
UNION 
SELECT 4 as ID, ' Abc ' as NAME, ' Mike ' as AUTHOR FROM DUAL 
UNION 
SELECT 5 as ID, ' Xyz ' as NAME, ' John ' as AUTHOR FROM DUAL 
UNION 
SELECT 1 as ID, ' Abc ' as NAME, ' Mike ' as AUTHOR FROM DUAL 
UNION 
SELECT 7 as ID, ' PQR ' as NAME, ' Raj ' as AUTHOR FROM DUAL) 
GROUP BY NAME 
ORDER by NAME; 
+0

죄송합니다 내가 이해하지 못하는 원하는 결과를 얻을 수있는 작은 순서와 함께 사람들을 넣습니다. 왜 테이블의 필드 앞에있는 테이블에서 고정 데이터 (ID로 2, 이름으로 'abc'등)를 선택합니까? 왜 조합인가? 고유 한 이름과 COUNT를 반환하는 쿼리는 달성하기 쉽고, 내가 도와 드릴 수는 있지만 나머지는 undestand가 아닙니다. 명확히하십시오. – ericpap

답변

1
SQL> with t as (
    2 SELECT 2 as ID, ' Abc ' as NAME, ' John ' as AUTHOR FROM DUAL 
    3 UNION 
    4 SELECT 6 as ID, ' Abc ' as NAME, ' John ' as AUTHOR FROM DUAL 
    5 UNION 
    6 SELECT 3 as ID, ' Xyz ' as NAME, ' Mike ' as AUTHOR FROM DUAL 
    7 UNION 
    8 SELECT 4 as ID, ' Abc ' as NAME, ' Mike ' as AUTHOR FROM DUAL 
    9 UNION 
10 SELECT 5 as ID, ' Xyz ' as NAME, ' John ' as AUTHOR FROM DUAL 
11 UNION 
12 SELECT 1 as ID, ' Abc ' as NAME, ' Mike ' as AUTHOR FROM DUAL 
13 UNION 
14 SELECT 7 as ID, ' PQR ' as NAME, ' Raj ' as AUTHOR FROM DUAL) 
15 select id, name, author, count# 
16 from (
17 select t.id, t.name, t.author, decode(grouping(id),1,count(*),null) count#, 
18 count(*) over (partition by name) cn, grouping(id) gid 
19 from t 
20 group by grouping sets((id,name,author),(name)) 
21 ) 
22 where (cn != 2 or count# is not null) 
23 order by name, gid desc, author 
24/

     ID NAME AUTHOR  COUNT#            
---------- ------ ------ ----------            
      Abc     4            
     2 Abc John               
     6 Abc John               
     4 Abc Mike               
     1 Abc Mike               
      PQR     1            
      Xyz     2            
     5 Xyz John               
     3 Xyz Mike     
0
select 
    id, name, author, decode(grouping_id(id, name), 2, count(*)) count 
from 
    books 
group by 
    rollup(name, (author, id)) 
having 
    grouping_id(id, name) != 3 
order 
    by name, id nulls first 
0

데이터 - 아래의 세트를 사용하여 예를 들어

한 저자 :

SELECT id, name, author, NULL "count" 
FROM mytable 
WHERE name NOT IN (SELECT name FROM myTable GROUP BY name HAVING count(1) = 1) 

SELECT id, name, author, NULL "count" 
FROM mytable 
WHERE name NOT IN (SELECT name FROM myTable GROUP BY name HAVING count(1) = 1) 
UNION ALL 
SELECT NULL id, name, NULL author, count(author) "count" 
FROM myTable 
GROUP BY name 
ORDER BY 2, 4, 1, 3 
+0

여러 테이블 스캔을 수행하고 있으므로 이것이 최적이라고 확신합니다. – user3498646