쿼리문 질문드립니다..(값 이상일때 특정값 출력하기) 0 21 1,026

by 성공한다 [Oracle 기초] [2018.10.29 20:35:47]


안녕하세요..

응시번호 지원자성명 심사위원판정(합,불) 종합판정 비고
홍길동 이순신 김시민 윤봉길 김구
1 지원자1    
2 지원자2    
3 지원자3    
4 지원자4    
5 지원자5    
6 지원자6    

심사위원 3분의 2이상 합일때 종합판정이 자동으로 합으로 될수 있게 하고 있는데..

쿼리문으로 가능할까요 ㅠㅠ

성적 테이블 : report

칼럼 : 응시번호(num), 이름(kname) , 합(report_result ='A') 불 (report_result ='B')

 

by 야신 [2018.10.29 21:11:09]

Select num, kname,cae when regexp_count(report_resul1||report_result2|| report_result3|| report_result4 ||report_sult5, '합') > 3 then 합 end


by 마농 [2018.10.29 21:31:05]

결과테이블만 보여주셨네요?
원본 테이블도 보여주세요.
한명의 지원자에 대한 결과가 (5열인지?) (5행인지?)


by 성공한다 [2018.10.30 10:22:02]
응시번호 지원자성명 심사위원 판정
1 지원자1 홍길동
1 지원자1 이순신

....

답변감사합니다.

이런식으로 지원자 1명에 심사위원5명이 심사하고.. 나머지 결과는 , 나머지 지원자에대한 심사테이블을 조인해서 할려고 합니다


by 마농 [2018.10.30 10:46:32]

5명 고정인가요? 인원 변동 없는지?
심사위원은 5명 이름 고정인가요? 변동 없는지?
이름이 아닌 (순서나 ID)로 관리되지는 않는지?
행을 열로 바꾸는 피벗쿼리에서 컬럼수와 컬럼값은 고정으로 알고 있어야 합니다.
가변으로 적용이 안됩니다. 가변 적용하려면 동적쿼리를 사용해야 합니다.
5명의 3분의2 이상은 몇명을 말하나요?  (5 * 2/3 = 3.33333명?) (버림 / 반올림 / 올림)?


by 성공한다 [2018.10.30 11:34:34]

답변감사합니다..

심사위원인원은 5명 고정이 아니고, 5명이상일수도 있고 이하 일수도 있습니다ㅠ

만약 5명일때 3명일때 합격처리 됩니다


by 마농 [2018.10.30 11:06:01]
WITH t AS
(
SELECT 1 응시번호, '지원자1' 지원자성명, '홍길동' 심사위원, '합' 판정 FROM dual
UNION ALL SELECT 1, '지원자1', '이순신', '합' FROM dual
UNION ALL SELECT 1, '지원자1', '김시민', '합' FROM dual
UNION ALL SELECT 1, '지원자1', '윤봉길', '불' FROM dual
UNION ALL SELECT 1, '지원자1', '김구'  , '불' FROM dual
UNION ALL SELECT 2, '지원자2', '홍길동', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '이순신', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '김시민', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '윤봉길', '합' FROM dual
UNION ALL SELECT 2, '지원자2', '김구'  , '합' FROM dual
)
SELECT 응시번호
     , MIN(DECODE(심사위원, '홍길동', 판정)) 홍길동
     , MIN(DECODE(심사위원, '이순신', 판정)) 이순신
     , MIN(DECODE(심사위원, '김시민', 판정)) 김시민
     , MIN(DECODE(심사위원, '윤봉길', 판정)) 윤봉길
     , MIN(DECODE(심사위원, '김구'  , 판정)) 김구  
     , CASE WHEN COUNT(DECODE(판정, '합', 1)) >= 3 THEN '합' ELSE '불' END 종합판정
  FROM t
 GROUP BY 응시번호
 ORDER BY 응시번호
;

 


by 마농 [2018.10.30 13:57:41]

"5명 이하도 이상도 될 수 있다"라는 표현보다는
몇명부터 몇명까지 가능하다 식의 구체적 표현이 좋습니다. (예 : 최소 3명 ~ 최대 7명)
"5명일때 3명일때 합격처리 됩니다."라는 표현보다는
"반올림 처리하여 3명입니다. 버림처리하여 3명입니다."식의 정확한 환산기준을 제시해 주세요.
위에서도 언급했듯이 가변 컬럼은 동적쿼리로 구현해야 합니다.
정적 쿼리로 구현하려면 결과형태를 바꿔야 합니다.
컬럼명에 이름을 출력하는 대신 번호를 출력하여 7개 최대로 고정하여 표시하는 방안이 있습니다.(최대 7개 가정)

WITH t AS
(
SELECT 1 응시번호, '지원자1' 지원자성명, '홍길동' 심사위원, '합' 판정 FROM dual
UNION ALL SELECT 1, '지원자1', '이순신', '합' FROM dual
UNION ALL SELECT 1, '지원자1', '김시민', '합' FROM dual
UNION ALL SELECT 1, '지원자1', '윤봉길', '불' FROM dual
UNION ALL SELECT 1, '지원자1', '김구'  , '불' FROM dual
UNION ALL SELECT 2, '지원자2', '홍길동', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '이순신', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '김시민', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '윤봉길', '합' FROM dual
UNION ALL SELECT 2, '지원자2', '김구'  , '합' FROM dual
)
SELECT 응시번호
     , 지원자성명
     , MIN(DECODE(rn, 1, 판정)) 판정1
     , MIN(DECODE(rn, 2, 판정)) 판정2
     , MIN(DECODE(rn, 3, 판정)) 판정3
     , MIN(DECODE(rn, 4, 판정)) 판정4
     , MIN(DECODE(rn, 5, 판정)) 판정5
     , MIN(DECODE(rn, 6, 판정)) 판정6
     , MIN(DECODE(rn, 7, 판정)) 판정7
     , CASE WHEN COUNT(DECODE(판정, '합', 1))
              >= FLOOR(COUNT(*) * 2/3) -- 총원의 2/3 이상 (소수점 이하 버림)
            THEN '합' ELSE '불' END 종합판정
  FROM (SELECT 응시번호, 지원자성명, 판정
             , ROW_NUMBER() OVER(PARTITION BY 응시번호 ORDER BY 심사위원) rn
          FROM t
        )
 GROUP BY 응시번호, 지원자성명
 ORDER BY 응시번호
;

 


by 성공한다 [2018.10.30 16:16:44]

감사합니다... 소스참고하여 해결했습니다..답변 정말 감사드립니다..

선생님 한가지만 더 질문해도 되겠습니까..ㅠ

select *

from report

where num='1'

응시번호 지원자성명 심사위원 판정
1 지원자1 홍길동
1 지원자1 이순신

이렇게 결과가 나오는데..

응시번호와 지원자성명의 중복값은 없애고...

응시번호 지원자성명 심사위원 종합판정 심사위원 종합판정  
1 지원자1 홍길동 이순신  

이런식으로 한 줄로 출력되게끔 할수는 없을까요.

 

 


by 성공한다 [2018.10.30 17:19:13]

죄송합니다..

생각해보니..심사위원수가 가변이라..동적쿼리로 구현을 해야할거 같은데 ㅠㅠ


by 마농 [2018.10.30 16:26:33]
WITH t AS
(
SELECT 1 응시번호, '지원자1' 지원자성명, '홍길동' 심사위원, '합' 판정 FROM dual
UNION ALL SELECT 1, '지원자1', '이순신', '합' FROM dual
UNION ALL SELECT 1, '지원자1', '김시민', '합' FROM dual
UNION ALL SELECT 1, '지원자1', '윤봉길', '불' FROM dual
UNION ALL SELECT 1, '지원자1', '김구'  , '불' FROM dual
UNION ALL SELECT 2, '지원자2', '홍길동', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '이순신', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '김시민', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '윤봉길', '합' FROM dual
UNION ALL SELECT 2, '지원자2', '김구'  , '합' FROM dual
)
SELECT 응시번호
     , 지원자성명
     , MIN(DECODE(rn, 1, 심사)) 심사1, MIN(DECODE(rn, 1, 판정)) 판정1
     , MIN(DECODE(rn, 2, 심사)) 심사2, MIN(DECODE(rn, 2, 판정)) 판정2
     , MIN(DECODE(rn, 3, 심사)) 심사3, MIN(DECODE(rn, 3, 판정)) 판정3
     , MIN(DECODE(rn, 4, 심사)) 심사4, MIN(DECODE(rn, 4, 판정)) 판정4
     , MIN(DECODE(rn, 5, 심사)) 심사5, MIN(DECODE(rn, 5, 판정)) 판정5
     , MIN(DECODE(rn, 6, 심사)) 심사6, MIN(DECODE(rn, 6, 판정)) 판정6
     , MIN(DECODE(rn, 7, 심사)) 심사7, MIN(DECODE(rn, 7, 판정)) 판정7
     , CASE WHEN COUNT(DECODE(판정, '합', 1))
              >= FLOOR(COUNT(*) * 2/3) -- 총원의 2/3 이상 (소수점 이하 버림)
            THEN '합' ELSE '불' END 종합판정
  FROM (SELECT 응시번호, 지원자성명, 판정
             , 심사위원 AS 심사
             , ROW_NUMBER() OVER(PARTITION BY 응시번호 ORDER BY 심사위원) rn
          FROM t
        )
 GROUP BY 응시번호, 지원자성명
 ORDER BY 응시번호
;

 


by 마농 [2018.10.30 17:37:04]

동적쿼리는 쿼리 영역이 아니라 프로그램 영역입니다.
답변의 정적 쿼리 문장을 프로그램에서 만들어 내는 것입니다.
심사위원 수만큼 루프 돌려가며 쿼리문 변수에 반복되는 구문을 붙여나가면 됩니다.
프로그램 언어을 뭘 쓰는지에 따라 구현하는 구문은 달라지겠죠.
다음은 PL/SQL 을 이용한 동적쿼리 작성법입니다.
http://gurubee.net/article/19612


by 성공한다 [2018.10.30 17:48:53]

감사합니다..

덕분에 도움 많이 되었습니다.

감사합니다


by 성공한다 [2018.11.01 17:07:54]

선생님.

저랑 비슷한 질문(?)이 올라왔던데.. 저는 과제가 아닌..취준생입니다 ㅠ

DB에 관심이 있어서 독학중입니다..ㅎ

 CASE WHEN COUNT(DECODE(판정, '합', 1))
              >= FLOOR(COUNT(*) * 2/3) -- 총원의 2/3 이상 (소수점 이하 버림)
            THEN '합' ELSE '불' END 종합판정

위의 쿼리에서 종합판정에 대한 합,불의 count하고 싶으면(합:1개/불:1개) 전체에 대한 count를 걸어야하는건가요 ㅠ?


by 마농 [2018.11.01 17:20:14]

종합판정의 건수를 또다시 세고 싶다는 건가요?
건수를 세어 어디에 어떻게 표현할 것인지? 에 따라 구현방법이 달라질 것입니다.
집계결과만 별도로 뽑을 건지?
전체 리스테에 집계결과를 같이 표현 할 것인지?
어떤 형태로 뽑을 건지?
원하시는 결과표를 그려보세요.


by 성공한다 [2018.11.01 18:30:20]

WITH t AS
(
SELECT 1 응시번호, '지원자1' 지원자성명, '홍길동' 심사위원, '합' 판정 FROM dual
UNION ALL SELECT 1, '지원자1', '이순신', '합' FROM dual
UNION ALL SELECT 1, '지원자1', '김시민', '합' FROM dual
UNION ALL SELECT 1, '지원자1', '윤봉길', '불' FROM dual
UNION ALL SELECT 1, '지원자1', '김구'  , '불' FROM dual

UNION ALL SELECT 2, '지원자2', '홍길동', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '이순신', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '김시민', '불' FROM dual
UNION ALL SELECT 2, '지원자2', '윤봉길', '합' FROM dual
UNION ALL SELECT 2, '지원자2', '김구'  , '합' FROM dual

UNION ALL SELECT 3, '지원자3', '홍길동', '불' FROM dual
UNION ALL SELECT 3, '지원자3', '이순신', '불' FROM dual
UNION ALL SELECT 3, '지원자3', '김시민', '불' FROM dual
UNION ALL SELECT 3, '지원자3', '윤봉길', '합' FROM dual
UNION ALL SELECT 3, '지원자3', '김구'  , '합' FROM dual

UNION ALL SELECT 4, '지원자4', '홍길동', '합' FROM dual
UNION ALL SELECT 4, '지원자4', '이순신', '합' FROM dual
UNION ALL SELECT 4, '지원자4', '김시민', '불' FROM dual
UNION ALL SELECT 4, '지원자4', '윤봉길', '합' FROM dual
UNION ALL SELECT 4, '지원자4', '김구' , '합' FROM dual
)
SELECT 응시번호
     , 지원자성명
     , MIN(DECODE(rn, 1, 심사)) 심사1, MIN(DECODE(rn, 1, 판정)) 판정1
     , MIN(DECODE(rn, 2, 심사)) 심사2, MIN(DECODE(rn, 2, 판정)) 판정2
     , MIN(DECODE(rn, 3, 심사)) 심사3, MIN(DECODE(rn, 3, 판정)) 판정3
     , MIN(DECODE(rn, 4, 심사)) 심사4, MIN(DECODE(rn, 4, 판정)) 판정4
     , MIN(DECODE(rn, 5, 심사)) 심사5, MIN(DECODE(rn, 5, 판정)) 판정5
     , MIN(DECODE(rn, 6, 심사)) 심사6, MIN(DECODE(rn, 6, 판정)) 판정6
     , MIN(DECODE(rn, 7, 심사)) 심사7, MIN(DECODE(rn, 7, 판정)) 판정7
     , CASE WHEN COUNT(DECODE(판정, '합', 1))
              >= FLOOR(COUNT(*) * 2/3) -- 총원의 2/3 이상 (소수점 이하 버림)
            THEN '합' ELSE '불' END 종합판정
  FROM (SELECT 응시번호, 지원자성명, 판정
             , 심사위원 AS 심사
             , ROW_NUMBER() OVER(PARTITION BY 응시번호 ORDER BY 심사위원) rn
          FROM t
        )
 GROUP BY 응시번호, 지원자성명
 ORDER BY 응시번호
;

실행하면

응시번호 지원자성명 심사1 판정1 심사2 판정2 심사3 판정3 심사4 판정4 심사5 판정5 '' '' '' '' 종합판정
1 지원자1 김구 김시민 윤봉길 이순신 홍길동        
2 지원자2 김구 김시민 윤봉길 이순신 홍길동        
3 지원자3 김구 김시민 윤봉길 이순신 홍길동        
4 지원자4 김구 김시민 윤봉길 이순신 홍길동        

이렇게 나오는데..

총집계

응시자수 불합격자수 합격자수  
4 2 2  

불합격자명단

응시번호 지원자 성명
2 지원자2
3 지원자3

합격자명단

응시번호 지원자 성명
1 지원자1
4 지원자4

이렇게..

집계결과만 따로 뽑고싶습니다.. 근데 종합판정은 테이블에 insert개념이 아닌데.....가능할까요..?

저녁식사 맛있게 하십시오.

 


by 성공한다 [2018.11.04 20:40:03]

  , CASE WHEN COUNT(DECODE(판정, '합', 1))
              >= FLOOR(COUNT(*) * 2/3) -- 총원의 2/3 이상 (소수점 이하 버림)
            THEN '합' ELSE '불' END 종합판정 여기에 count를 걸었는데 잘 안되네요 ㅠ


by 마농 [2018.11.05 10:16:23]
-- 총집계 --
SELECT COUNT(*) 응시자수
     , COUNT(DECODE(종합판정, '불', 1)) 불합격자수
     , COUNT(DECODE(종합판정, '합', 1)) 합격자수
  FROM (SELECT CASE WHEN COUNT(DECODE(판정, '합', 1))
                      >= FLOOR(COUNT(*) * 2/3)
                    THEN '합' ELSE '불' END 종합판정
          FROM t
         GROUP BY 응시번호
        )
;
-- 합격자명단/불합격자명단 --
SELECT *
  FROM (SELECT 응시번호, 지원자성명
             , CASE WHEN COUNT(DECODE(판정, '합', 1))
                      >= FLOOR(COUNT(*) * 2/3)
                    THEN '합' ELSE '불' END 종합판정
          FROM t
         GROUP BY 응시번호, 지원자성명
        )
 WHERE 종합판정 = '불'  -- 불합격자명단
-- WHERE 종합판정 = '합'  -- 합격자명단
 ORDER BY 응시번호
;

 


by 성공한다 [2018.11.12 21:27:52]

답변 감사합니다..덕분에 잘 도움이 많이 되었습니다.

선생님 응용을 조금 하고 싶은데..좀 막히네요..

만약 심사위원이 5명이상일 경우 항목별 최고점과 최하점을 제외하고 계,평균을 구하고 싶습니다.

(만약 소수점이 나올경우 둘째 자리에서 반올림)

 

응시번호 지원자성명 항목 심사위원판정 평균 최종평균합계
홍길동 이순신 김시민 윤봉길 김구
     1     지원자1 창의성 7점 8점 7점 8점 9점 23점 8점         7점
독창성 7점 7점 9점 7점 8점 22점 7점
정직성 6점 8점 9점 7점 7점 22점 7점

 

SELECT  person_no
               , kname
               , MAX(CASE WHEN RN = 1 THEN judge_name END )simsa_staff_id
               , MAX(CASE WHEN RN = 1 THEN hard_q_1 END ) hard_q_1
               , MAX(CASE WHEN RN = 1 THEN judge_name END )simsa_staff_id
               , MAX(CASE WHEN RN = 1 THEN hard_q_2 END ) hard_q_2
               , MAX(CASE WHEN RN = 1 THEN judge_name END )simsa_staff_id
               , MAX(CASE WHEN RN = 1 THEN hard_q_3 END ) hard_q_3
               , MAX(CASE WHEN RN = 2 THEN judge_name END ) simsa_staff_id1
               , MAX(CASE WHEN RN = 2 THEN hard_q_1 END ) hard_q_11
               , MAX(CASE WHEN RN = 2 THEN judge_name END ) simsa_staff_id1
               , MAX(CASE WHEN RN = 2 THEN hard_q_2 END ) hard_q_21
               , MAX(CASE WHEN RN = 2 THEN judge_name END ) simsa_staff_id1
               , MAX(CASE WHEN RN = 2 THEN hard_q_3 END ) hard_q_31  
               , MAX(CASE WHEN RN = 3 THEN judge_name END ) simsa_staff_id2
               , MAX(CASE WHEN RN = 3 THEN hard_q_1 END  ) hard_q_12   
               , MAX(CASE WHEN RN = 3 THEN judge_name END ) simsa_staff_id2
               , MAX(CASE WHEN RN = 3 THEN hard_q_2 END  ) hard_q_22
               , MAX(CASE WHEN RN = 3 THEN judge_name END ) simsa_staff_id2
               , MAX(CASE WHEN RN = 3 THEN hard_q_3 END  ) hard_q_32

           FROM (SELECT b.person_no,staff_id , a.hard_q_1 ,a.hard_q_2,a.hard_q_3,b.part_code,b.major,b.kname ,c.judge_name,ROW_NUMBER() OVER(PARTITION BY a.person_no ORDER BY ROWNUM) RN
           FROM simsa a, staff b , judge c
          WHERE a.person_no  = b.pno
         )
       GROUP BY person_no, kname
       ;

이렇게 실행하면 이런식으로 출력이 됩니다.

응시번호 지원자성명 심사위원 창의성 독창성 정직성 심사위원2 창의성 독창성 정직성 심사위원3 창의성 독창성 정직성
1 지원자1 홍길동 7 8 6 이순신 8 7 8 김시민 7 9 9

 


by 마농 [2018.11.13 09:10:30]

새로운 질문은 답글이 아닌 새글로 질문해 주세요.
질문은 결과만 올리지 마시고
될 수 있으면 원본대비 결과표로 질문해 주세요.
 

WITH simsa AS
(
SELECT 1 person_no, 11 judge_no, 7 hard_q_1, 7 hard_q_2, 6 hard_q_3 FROM dual
UNION ALL SELECT 1, 22, 8, 7, 8 FROM dual
UNION ALL SELECT 1, 33, 7, 9, 9 FROM dual
UNION ALL SELECT 1, 44, 8, 7, 7 FROM dual
UNION ALL SELECT 1, 55, 9, 8, 7 FROM dual
)
, staff AS
(
SELECT 1 pno, '쯔위' kname FROM dual
)
, judge AS
(
SELECT 11 judge_no, '채영' judge_name FROM dual
UNION ALL SELECT 22, '다현' FROM dual
UNION ALL SELECT 33, '지효' FROM dual
UNION ALL SELECT 44, '정연' FROM dual
UNION ALL SELECT 55, '나연' FROM dual
)
SELECT person_no
     , kname
     , NVL(gb, '평가자') gb
     , NVL2(gb, MIN(DECODE(rn, 1, v))||'', MIN(DECODE(rn, 1, nm))) v1
     , NVL2(gb, MIN(DECODE(rn, 2, v))||'', MIN(DECODE(rn, 2, nm))) v2
     , NVL2(gb, MIN(DECODE(rn, 3, v))||'', MIN(DECODE(rn, 3, nm))) v3
     , NVL2(gb, MIN(DECODE(rn, 4, v))||'', MIN(DECODE(rn, 4, nm))) v4
     , NVL2(gb, MIN(DECODE(rn, 5, v))||'', MIN(DECODE(rn, 5, nm))) v5
     , NVL2(gb,          (SUM(v) - MIN(v) - MAX(v)), '') v_sum
     , NVL2(gb, ROUND(   (SUM(v) - MIN(v) - MAX(v)) / 3), '') v_avg
     , NVL2(gb, ROUND(SUM(SUM(v) - MIN(v) - MAX(v))
                      OVER(PARTITION BY person_no, GROUPING(gb)) / 9, 2), '') tot
  FROM (SELECT a.person_no
             , b.kname
             , ROW_NUMBER() OVER(PARTITION BY a.person_no ORDER BY a.judge_no) rn
             , c.judge_name nm
             , a.hard_q_1   q1
             , a.hard_q_2   q2
             , a.hard_q_3   q3
          FROM simsa a
             , staff b
             , judge c
         WHERE a.person_no = b.pno
           AND a.judge_no  = c.judge_no
        )
 UNPIVOT (v FOR gb IN (q1 AS '1.창의성', q2 AS '2.독창성', q3 AS '3.정직성')) a
 GROUP BY person_no, kname, ROLLUP(gb)
 ORDER BY person_no, kname, a.gb NULLS FIRST
;

 


by 성공한다 [2018.11.13 12:55:23]

네 죄송합니다.

답변감사합니다.

심사위원수를 count하여 5명이상일때만 (5명 미만일때는 항목별 최하점,최고점 제외안함) 항목별 최하점과 최고점을 제외하고 계,평균을 구하고 싶습니다..ㅠㅠ

 


by 마농 [2018.11.13 13:02:18]

원본 대비 결과표를 가지고 새롭게 질문해 주세요. (댓글 말고 새글)
원본과 결과는 인과관계가 정확하게 일치해야 하고
다양한 예시자료(5명 이상, 5명, 5명 이하 등)가 포함되어야 합니다.

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