고수님들 쿼리 하나만 도와주세요 0 19 1,043

by K-ART [Oracle 기초] [2019.05.29 13:17:46]


테이블

부서   이름         금액         사번

A      김태희         100        00

A      김태희         200        00

A      김태희         100        00

A       쯰위          1000        01

A       쯔위          100         01

A      김희선        500        02

----------------------결과--------------------------

A     쯔위    1100   01

----------------------------------------------------------

부서로 그룹바이 해서  이름 들중 금액 합계가 가장 큰거 출력

핵심 조건 부서로만 그룹바이 해야됨 이게 가능한가요?

 

by JAEM JAEM [2019.05.29 13:36:28]

넵 가능합니다


by K-ART [2019.05.29 13:45:49]

어떻게 하나요?


by 우리집아찌 [2019.05.29 13:36:33]
select * 
  from ( select a.* 
                     , row_nunber() over(partition by 부서 order by 금액 desc ) rn
                  from 테이블 a
          )
 where rn = 1

 


by K-ART [2019.05.29 13:38:54]

그룹바이 요건 안하셔서 요건이 부서 그룹바이 선행 되어야합니다.


by 마농 [2019.05.29 14:06:21]

핵심조건 부서에 대한 설명이 부족합니다.
공동 1등에 대한 처리 기준이 부족합니다.


by K-ART [2019.05.29 14:07:56]

A 부서 하나뿐입니다. 그리고 공동 1등 조건은없습니다.  무조건 1등 2등 3등 이렇게 나옵니다. SUM금액이 같을순 없습니다.


by 마농 [2019.05.29 14:14:08]

하나의 값이라면 어플리케이션에서 같은 값이 안들어 오게 제어가 가능하겠지만
여러행의 SUM 값이 같지 않게 제어하기는 힘들텐데요?
금액이 같을 리가 절대 없다고 확신하시는 이유가 있나요?


by K-ART [2019.05.29 14:16:49]

요건이 그랬습니다 절대 같을수없다고 하네요  만약에 혹시 같으면 같은거중 아무꺼나 나오면 된다고하네요

 


by 생각 [2019.05.29 14:16:31]

과제에 GROUP BY 사용은 필수라고 했나보네요?


by 마농 [2019.05.29 14:18:27]
WITH t AS
(
SELECT 'A' deptno, '김태희' ename, 100 amt, '00' empno FROM dual
UNION ALL SELECT 'A', '김태희',  200, '00' FROM dual
UNION ALL SELECT 'A', '김태희',  100, '00' FROM dual
UNION ALL SELECT 'A', '쯰위'  , 1000, '01' FROM dual
UNION ALL SELECT 'A', '쯔위'  ,  100, '01' FROM dual
UNION ALL SELECT 'A', '김희선',  500, '02' FROM dual
)
SELECT *
  FROM (SELECT deptno, empno, ename
             , SUM(amt) amt
             , RANK()       OVER(PARTITION BY deptno ORDER BY SUM(amt) DESC) rk  -- 공동순위
             , ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY SUM(amt) DESC, empno) rn  -- 단일순위(사번 빠른순)
          FROM t
         WHERE deptno = 'A'
         GROUP BY deptno, empno, ename
        )
 WHERE rn = 1
;

 


by K-ART [2019.05.29 14:19:13]

요건이 그룹바이 부서 하나만 들어가야되는데 불가능한건가요?


by 마농 [2019.05.29 14:23:25]

그룹바이는 요건이 아니라 도구입니다. 도구 사용까지도 제한하나요?
요건을 만족하여 결과를 도출하는 방법은 여러가지일 수 있습니다.
또한 공동 순위에 대한 조건이 모호합니다.
공동순위는 없다 --> 있다면 아무거나?
이런 모호한 조건 말고 명확한 조건이 필요합니다.
금액이 같으면 사번순으로 가져온다던가 하는 조건.
이게 없다면 똑같은 조회를 할때도 결과가 다를 수 있습니다.
공동 1등이 쯔위와 김희선인데
첫번째 조회 때는 쯔위가 나왔다가
두번째 조회 때는 김희선이 나온다면?
이 결과에 대한 신뢰를 잃게 됩니다.
항상 똑같은 결과를 정확하게 도출해 줘야 합니다.


by K-ART [2019.05.29 14:39:32]

다시 답변 드릴게요 공동 순위라면 사번이 빠른순으로 하시면되는데 group by 부서 로 해서 결과 값이 나와야됩니다.

너무 어렵네


by 마농 [2019.05.29 14:43:17]

"그룹바이에 부서 하나만 들어가야 한다" 불가능한가요?
 - 가능합니다. 억지로 만들면 가능합니다. 하지만 쿼리는 더 복잡하고 지저분해 질 뿐입니다.
 - 어차피 사원별 급여합계가 순위의 기준이므로 사원별 집계를 안할 수는 없습니다.
 - 즉, 부서별 집계만으로는 구할 수 없는 문제입니다.
 - 사원별 집계 후에 다시 한번 부서별 집계 하면 되는데... 이게 요건에 맞는 건지?
그룹바이 부서번호만 반드시 해야한다는 요건이 있나요?
 - 해당 요구조건의 전문을 볼 수 있나요? 토시하나 틀리지 않고 옮겨주세요.


by K-ART [2019.05.29 14:50:38]

쿼리가 너무 길어서 핵심 요건? 기능만  간락하게 요약 및 도출 해서 질문 드린건데 마농님 답볍 주신걸로 보니 현재 구조상

group by 부서 하나 만 들어가는것으로 힘들어 보이네요 억지로 짜는 그렇게 되겠네요  


by 열심열심 [2019.05.29 14:55:25]

select  *
from (
select deptno,empno,ename, sum(AMT) as AMT from t 
group by deptno,ename,empno  )
where rownum=1
order by AMT desc;

위의 최고 전문가분들도 이해 못하시니 저도 정확히 어떤 의미인지 잘 모르겠네요 


by 마농 [2019.05.29 14:56:22]

원본으로부터 원하는 결과를 도출하는 방법은 다양합니다.
그 다양한 방법중에 최선의 방법을 택해야 하는데...
1가지 방식을 고집하여 문제를 풀이하려고 하다보면 오히려 더 복잡해지고 어려워집니다.


by 마농 [2019.05.29 14:59:11]
-- 1. 그룹바이 없는 쿼리
SELECT deptno
     , empno
     , ename
     , amt
  FROM (SELECT deptno, empno, ename
             , SUM(amt) amt
          FROM t
         WHERE deptno = 'A'
         GROUP BY deptno, empno, ename
         ORDER BY amt DESC, empno
        )
 WHERE ROWNUM = 1
;
-- 2. 억지로 그룹바이를 넣은 쿼리
SELECT deptno
     , MIN(empno) empno
     , MIN(ename) ename
     , MIN(amt) amt
  FROM (SELECT deptno, empno, ename
             , SUM(amt) amt
          FROM t
         WHERE deptno = 'A'
         GROUP BY deptno, empno, ename
         ORDER BY amt DESC, empno
        )
 WHERE ROWNUM = 1
 GROUP BY deptno  -- 요건
;

 


by K-ART [2019.05.29 17:00:01]

많은 공부 가되었네요~다들 감사합니다. 다음에는 좀더 요건과 질문의 정확성 높해서 질문하도록하겠습니다. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입