'합계'에 해당되는 글 7

  1. 2008.04.14 소계,합계 내는 쿼리들 모음_01... ROLLUP/CUBE 이용

단일 select문으로 출력을 해야되는데요. 많이들 도와주세요

비공개 2007.06.27 23:09

답변 3| 조회 605

테이블은

학년      이름         반        점수

1학년  홍길동     1반          100

1학년  이기자     2반          50

2학년  차인표     1반          20

2학년  인순이     2반          90

3학년  이순신     1반          15

3학년  날라리     2반          5

이렇게 있습니다.


이것을 오라클이나 mssql등에서 지원하는 함수를 쓰지 않고(sum, avc등 제외)


1학년  홍길동     1반          100

1학년  이기자     2반          50

1학년                                    150

2학년  차인표     1반          20

2학년  인순이     2반          90

2학년                                    110

3학년  이순신     1반          15

3학년  날라리     2반          5

3학년                                    20

1반                                        135

2반                                        145

total                                      280

단일 select로 출력을 해야되는데요...


아무리해도 부분적인거밖에 구현이 되질 않네요..ㅜㅜ


sql고수분들의 도움 부탁드려요

추가된 질문
2007.07.01 19:34 추가
DBMS는 오라클입니다.

rollup/cube나 partition by등 사용자의 편의를 위해 제공되는 함수등은 사용하지 않아야 합니다.

단 sql를 처음 배울때 쓰는 sum이나 count, agv, case문같은건 사용해도 됩니다.

 

re: 단일 select문으로 출력을 해야되는데요. 많이들 도와주세요

질문자인사 copy_t를 이용하고 case문을 절적히 써서 푸는 문제였습니다...이걸 깜빡하고 적질 않았네요...정말 죄송합니다..^^;

추가질문의 내용을 위로 답니다...;


ROLLUP/CUBE를 별도의 함수로 생각하시는지, 왜 쓰면 안되는지 알려주실 수는 없나요?

강사나 교수가 그렇게 시켜서인가요...?

그럼 union으로 여러번 테이블을 select하여 계산하여 덧 붙이던지, 대용량데이터베이스 솔루션에서 소개된 일명 copy_t 테이블을 이용해야 하는데...copy_t 테이블의 언급이 없는 것으로 보아 데이터, 합계, 소계등을 각각 여러번의 select로 중복 table access하여 union등으로 덧 붙여서 만들라는 얘기같은데요...만약 님이 만드신 문제라면 적절하지 않은 문제이니 바꾸시고 union all등을 따로 검색하여 공부하시기 바랍니다.


만약 강사님등이 그렇게 문제를 냈다면 당장 거기서 배우는 것을 때려치우시라고 말씀드리고 싶군요.

문제도 함수에 맞게 적절한 문제를 내야지 맞다고 생각합니다...원하는 답이 union사용법이라면 이 문제는 정말 어처구니 없이 적절하지 않은 내용입니다.

하나를 보면 열을 안다고 강사의 수준이 이문제 정도라면 거기서 계속 배우면 님 손해가 이만저만이 아니겠군요...;

현재 11g버전이 나오느니 마느니 하는 시점에 옛날고려적 버전에서나 지원되지 않았던 기능을 쓰지말고 만드는 비효율적인 쿼리를 가르치다니...;


아무튼 채택안하셔도 좋으니 느껴라도 보시길...;

Group by시 Cube를 쓰면 위 쿼리가 얼마나 간결해지는지를...


SELECT 학년, 이름, 반, SUM(점수)
FROM 테이블명 --> 테이블은 정확히 1번만 access

GROUP BY CUBE(학년, 이름, 반)
HAVING GROUPING(학년) || GROUPING(반) || GROUPING(이름) = '000'
    OR GROUPING(학년) || GROUPING(반) || GROUPING(이름) = '011'
    OR GROUPING(학년) || GROUPING(이름) = '11'


union all로 비효율적으로 만드는 방법은 정말로 님이 쓰시는 오라클 버전이 지원이 되지않아 그런거면 그렇다고 써 주세요...그러면 만들어 드리겠습니다.;

현재로서는 일반적인 8i이상버전이라고 짐작되어 제 양심상 못만들겠으니 양해하시길...;


방법은 아래와 같습니다...상세한 것은 직접 만들어 보세요...;

SELECT 생데이터 FROM 테이블  --> 1번 access

UNION ALL

SELECT 학년별 집계된 데이터 FROM 테이블 --> 2번 access

UNION ALL

SELECT 반별 집계된 데이터 FROM 테이블 --> 3번 access

UNION ALL

SELECT 총합 데이터 FROM 테이블  --> 4번 access

같은 결과를 내지만 이 얼마나 어처구니 없는 쿼리입니까?


건승하시길...수고하세요~~

==========================================================================


DBMS 제품 종류에 따라 Group By 시 간단하게 ROLLUP/CUBE 등으로 구할 수 있는 결과입니다.


오라클, MSSQL의 함수를 쓰지 말라고 하시니 그럼 사용하는 DBMS 제품이 뭔가요?

(sum은 제외라고 했으니 sum함수는 써도된다는 말이겠지요? )