2014-01-27 2 views
0

첫째, 더 나은 질문 제목을 생각할 수 없습니다. 그 사과.SQL 롤업 - 여러 번 레코드 합계를 방지하십시오.

그래서 저는 쿼리를 작성 중이며 여기에 함수와 그룹을 집계하지 않고 리턴 할 것이라고 생각합니다. 예를 들어 이것을 사용하고 있으며 실제 검색어에 더 많은 필드가 포함되어 있습니다.

SUBJ CLASSROOM CLASSROOM_CAPACITY 
A  1   25 
B  2   50 
C  3   60 
A  2   50 
A  1   25 <--Not actually duplicate 

이제 중복 레코드가 있다고 말할 수 있습니다. 그러나 실제로는 중복되는 레코드에 대해 다른 값을 갖는 일부 필드 (여기서는 표시되지 않음)가있는 방식으로 중복되지 않습니다.

내가 원하는 것은 :

SUBJ CLASSROOM CLASSROOM_CAPACITY 
A  1   25 
     2   50 
     TOTAL  75 
B  2   50 
     TOTAL  50 
C  3   60 
     TOTAL  60 
//EDIT - Apparently following line is causing too much confusion. Ignore it. How can I get rest of the table correctly? 
TOTAL   135 //It seems its quite difficult to get 135 here. Its ok if this total is messed up 

내가 노력하고 무엇 : 문제

SELECT 
SOME_FIELDS, 
SUBJ, 
CLASSROOM, 
SUM(CLASSROOM_CAPACITY) 
FROM 
MYTABLE 
WHERE ..... 
GROUP BY SOME_FIELDS, ROLLUP(SUBJ,CLASSROOM) 

: 사람들에게
덕분에 "겉으로 중복은"기록, 교실 용량이 여러 번 요약되고있다. 어떻게 방지 할 수 있습니까? 내가 잘못하고있는거야?
실제 쿼리는 더 복잡합니다.하지만이 쿼리를 올바르게 만들 수 있다면 더 큰 쿼리에 적용 할 수 있다고 생각합니다.

추신 : ROLLUP을 사용하여 빈 항목 대신 "전체"텍스트를 가져 오는 방법을 알고 있으므로 해당 부분을 건너 뛸 수 있습니다.

+1

가 어떻게 135의 총합계를받을 수 있나요을? 어떤 가치관을 합산하고 그것을 얻기 위해 어떤 가치를 배제하고 있습니까? 포함 할 값을 어떻게 알 수 있습니까? –

+0

나는 그것을 얻지 못하고있다. 나는 그것을 얻고 싶다. 25 + 50 + 60 명에 해당하는 모든 교실의 강의실 용량 합계. 그러나 그것은 중요하지 않습니다. 나는 적어도 다른 합계가 맞기를 바란다. – tumchaaditya

+0

나는 그것이 나쁜 예라는 것을 안다. 하지만 내가 생각해 낼 수있는 최선의 .. – tumchaaditya

답변

1

소개하고있는 카디널리티는 조금 벗어나서 ROLLUP이 작동하기 시작하면 정렬됩니다. 당신의 말하는 :

SUBJ CLASSROOM CLASSROOM_CAPACITY 
A  1   25 

이 같다 :

SUBJ CLASSROOM CLASSROOM_CAPACITY 
A  1   25 

그러나 SOME_FIELDS이 행에 따라 다를 수 있습니다. 위 열만 집계하면 SOME_FIELDS은 어떻게 될 것으로 예상됩니까?

이 쿼리의 목적에 따라 무시할 수있는 경우 가장 좋은 방법은 먼저 DISTINCT 개의 레코드 (예 : subj, classroom 및 classroom_capacity의 고유 한 튜플이 포함 된 레코드)를 찾은 다음이 데이터 세트에서 ROLLUP을 수행하는 것입니다.

WITH distinct_subj_classrm_capacity AS (
    SELECT DISTINCT 
    subj 
    , classroom 
    , classroom_capacity 
    FROM mytable 
) 
SELECT 
    subj 
, classroom 
, SUM(classroom_capacity) 
FROM distinct_subj_classrm_capacity 
GROUP BY ROLLUP(subj, classroom) 

당신이 휴식 보고서에 관심이없는 경우가 ROLLUP 당신을 제공하고 당신은 단순히 (자세한 내용은 여기에 대한 참조 다음 SUM의 분석 버전을 사용할 수있는 원료 합계를 원하는 결과 : 다음 쿼리는이 달성 오라클 분석 기능 : http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions004.htm)

WITH distinct_subj_classrm_capacity AS (
    SELECT DISTINCT 
    subj 
    , classroom 
    , classroom_capacity 
    FROM mytable 
) 
SELECT DISTINCT 
    subj 
, SUM(classroom_capacity) OVER (PARTITION BY subj) classroom_capacity_per_subj 
FROM distinct_subj_classrm_capacity 

이는 형식으로 결과를 제공합니다

SUBJ CLASSROOM_CAPACITY_PER_SUBJ 
A  75 
B  50 
C  60 
+0

감사합니다. 'SOME_FIELDS'는'SUM()'에 싸여 있기 때문에 롤업에 추가됩니다. 나는 별개의 것을 실험 할 것이다. – tumchaaditya