2008-11-12 2 views
1

나는 이것을 할 수있는 방법이 있다고 믿는다. 그러나 나는 다른 많은 사람들만큼 오라클 10g에 익숙하지 않다. 시나리오는 다음과 같습니다.ORACLE SQL : 하나의 문장에서 CODE에 종속적 인 여러 SUMS

현재 ASP.net 2.0으로 기본 ASP 페이지를 변환하고 있습니다. 보고서를 만드는 쿼리가 있습니다. 판매 대 이전 판매를보고합니다. 현재 하나의 검색어가 데이터베이스로 이동하여 Google 제품을 판매하는 위치의 전체 목록을 가져 오는 중입니다. 그런 다음 위치의 모든 단일 행을 반복하고 SQL에서 일부 합계 연산을 실행합니다.

다른 테이블로 이동하여 판매 수량을 합한 다음 테이블 행에 합계를 추가합니다. 위치 쿼리가 많은 결과를 반환하기 때문에 쿼리에 2-3 분이 걸립니다.

제 질문은이 모든 것을 하나의 쿼리로 통합하는 방법입니다.

LOCATIONS 질의 :

SELECT DISTINCT t.location, 
    l.city, 
    f.year, 
    f.customer FROM loc t, 
location l, father_table f 
WHERE f.number = t.number(+) 
AND f.code = '0001' 
AND f.c_code = '01' 
AND t.location= l.code(+) 
AND t.code IN ('C', 'S') 
AND t.co_code IN ('G', 'V', 'A', 'D') 
AND t.year = '2008' 
ORDER BY l.city, f.year 

상기 질의 내의 각 행의 합 쿼리 이쪽은 :

대신에 원래의 질의의 각 레코드를 통해 루핑
SELECT SUM(nvl(t.sale_quantity,0)) sale_quantity 
FROM loc t, father_table f 
WHERE f.number = t.number(+) 
AND f.code = '0001' 
AND f.c_code = '01' 
AND f.year = '2008' 
AND t.code = 'C' 
AND t.location = '1566' <----- EACH ROW'S t.location VALUE 
AND t.co_code IN ('G', 'V', 'A', 'D') 
GROUP BY t.location, t.code, f.year 

가있다 거기 방법은 내가 쿼리를 결합하고 위치의 쿼리에 SUM을 가질 수 있습니다. 여기서 핵심은 t.code = 'C'가 아닌 'C'가 아닌 두 번째 쿼리에서만 판매 SUM을 얻는다는 것입니다. & 'S'

답변

5

나는 이것이 당신이 원하는대로한다고 생각합니다. 그것이 정확하지 않다면, 당신이 알아야 할 중요한 것이 CASE 표현이라고 생각합니다. 이것은 SUM 함수 내에서 필터링하는 방법입니다.

SELECT t.location, 
    l.city, 
    f.year, 
    f.customer, 
    SUM(NVL(CASE WHEN t.code ='C' THEN t.sale_quantity ELSE 0 END, 0)) sale_quantity 
FROM loc t, location l, father_table f 
WHERE f.number = t.number(+) 
AND f.code = '0001' 
AND f.c_code = '01' 
AND t.location= l.code(+) 
AND t.code IN ('C', 'S') 
AND t.co_code IN ('G', 'V', 'A', 'D') 
AND t.year = '2008' 
GROUP BY t.location, l.city, f.year 
ORDER BY l.city, f.year