좀 난감한 쿼리 힌트좀 주세요 0 10 1,134

by 잼따군 [2013.08.09 14:47:53]


    master 테이블  ---         1:N   -<    detail테이블       ---
    coloumn a가 PK master KEY +@(coloumn) 가 PK    
정보 A
정보 B
정보 C



의 구조로된 테이블이 존재할때 master테이블의 PK별로 select를 해야합니다..

그런데 detail 테이블의 A B C 의 정보가 각 masterPK별로만약 A coloumn 값이 여러가지가 존재하면 여러개가 존재한다고만 표현해주고(ex>'multi')
 한가지만 존재한다면 그값을 뽑아내야합니다 .같은 방법으로 B coloumn과 C coloumn도 표현해야 하는데 방법이있을까요..

row_number() 로 로우값주고 select로 다시묶어서 max(rownm) 뽑아서 하려고 해도 group by를 해야해서 한로우로 안나오고 여러로우로 나오네요... 도움좀 부탁드립니다...
by 미카엘 [2013.08.09 15:18:32]

질문내용에 대한 궁금한 점이 있습니다.

값이 여러개 존재시 'multi'라 표현해주고 한 가지만 존재한다면 그값을 뽑아내야 합니다. 란 뜻은

여러개 값 존재시 'multi'를 뽑고 싶은건지??
한 가지만 존재할때의 결과를 뽑고싶은건지??
아니면 둘다?? ^^

궁금해서 물어봅니다.

by 아린 [2013.08.09 15:19:39]
WITH mst(key1) AS(
SELECT 'key1' FROM dual UNION ALL
SELECT 'key2' FROM dual UNION ALL
SELECT 'key3' FROM dual
), dtl(key1, key2, col_a, col_b, col_c) AS(
SELECT 'key1', '01', 'info_a1',        '',        '' FROM dual UNION ALL
SELECT 'key1', '02', 'info_a2', 'info_b1', 'info_c1' FROM dual UNION ALL
SELECT 'key1', '03', 'info_a3', 'info_b2',        '' FROM dual UNION ALL
SELECT 'key2', '01', 'info_a1',        '',        '' FROM dual UNION ALL
SELECT 'key2', '02', 'info_a2',        '', 'info_c1' FROM dual
)
SELECT a.key1
     , CASE WHEN COUNT(col_a) = 0 THEN NULL
            WHEN COUNT(col_a) = 1 THEN MIN(col_a)
            WHEN COUNT(col_a) > 1 THEN 'multi'
       END a
     , CASE WHEN COUNT(col_b) = 0 THEN NULL
            WHEN COUNT(col_b) = 1 THEN MIN(col_b)
            WHEN COUNT(col_b) > 1 THEN 'multi'
       END b                     
     , CASE WHEN COUNT(col_c) = 0 THEN NULL
            WHEN COUNT(col_c) = 1 THEN MIN(col_c)
            WHEN COUNT(col_c) > 1 THEN 'multi'
       END c                     
  FROM mst a, dtl b
 WHERE a.key1 = b.key1
 GROUP BY a.key1

by 아린 [2013.08.09 15:32:08]
SELECT a.key1
     , DECODE(COUNT(col_a), 0, NULL, 1, MIN(col_a), 'multi') a 
     , DECODE(COUNT(col_b), 0, NULL, 1, MIN(col_b), 'multi') b
     , DECODE(COUNT(col_c), 0, NULL, 1, MIN(col_c), 'multi') c
  FROM mst a, dtl b
 WHERE a.key1 = b.key1 
 GROUP BY a.key1

by 잼따군 [2013.08.09 15:33:15]
미카엘님 두경우 다 필요한거에요
 값이 여러가지일경우에는 'multi'로 표현해주고 한가지만 존재할때는 그값을 뽑아야해요

by 잼따군 [2013.08.09 15:41:07]
아린님 두번째 주신쿼리는 안맞는거같고요... 값이 다 똑같아도 count가 세져서 그냥 'multi'로 나오네요.. 첫번째 쿼리문은 지금 분석하고 적용중입니다. 신경써주셔서 감사합니다

by 아린 [2013.08.09 15:47:10]
값이 다 똑같아도 count가 세져서 그냥 'multi'로 나오네요 "

이 말은 아래 col_a 컬럼의 값이 '
info_a1' 로 동일하기 때문에
총 건수는 3건이지만 1건으로 봐야한다는 건가요?
(그렇다면, 첫번째 sql도 별반 차이가 없을듯 하네요)

dtl(key1, key2, col_a, col_b, col_c) AS(
SELECT 'key1', '01', 'info_a1',        '',        '' FROM dual UNION ALL
SELECT 'key1', '02', 'info_a1', 'info_b1', 'info_c1' FROM dual UNION ALL
SELECT 'key1', '03', 'info_a1', 'info_b2',        '' FROM dual UNION ALL


by 잼따군 [2013.08.09 15:48:43]
아린님 첫번째 쿼리로직도

 WITH mst(key1) AS(
SELECT 'key1' FROM dual UNION ALL
SELECT 'key2' FROM dual UNION ALL
SELECT 'key3' FROM dual
), dtl(key1, key2, col_a, col_b, col_c) AS(
SELECT 'key1', '01', 'info_a1',        '','info_c1' FROM dual UNION ALL
SELECT 'key1', '02', 'info_a2', 'info_b1', 'info_c1' FROM dual UNION ALL
SELECT 'key1', '03', 'info_a3', 'info_b2', 'info_c1' FROM dual UNION ALL
SELECT 'key2', '01', 'info_a1',        '',        '' FROM dual UNION ALL
SELECT 'key2', '02', 'info_a2',        '', 'info_c1' FROM dual
)
SELECT a.key1
     , CASE WHEN COUNT(col_a) = 0 THEN NULL
            WHEN COUNT(col_a) = 1 THEN MIN(col_a)
            WHEN COUNT(col_a) > 1 THEN 'multi'
       END a
     , CASE WHEN COUNT(col_b) = 0 THEN NULL
            WHEN COUNT(col_b) = 1 THEN MIN(col_b)
            WHEN COUNT(col_b) > 1 THEN 'multi'
       END b                     
     , CASE WHEN COUNT(col_c) = 0 THEN NULL
            WHEN COUNT(col_c) = 1 THEN MIN(col_c)
            WHEN COUNT(col_c) > 1 THEN 'multi'
       END c                     
  FROM mst a, dtl b
 WHERE a.key1 = b.key1
 GROUP BY a.key1;

이렇게 key1 의  col_c 의 값이 모두 동일하게info_c1로 들어갈경우 'multi'가 아닌 info_c1로 나와야해요..ㅠㅠ

아 첨앤 쉽게 생각했었는데.. 작업 들어가면서 쎄하더니.. 이렇게 어려운가요.ㅠㅠ

by 아린 [2013.08.09 15:48:57]
카운트에 distinct 추가했습니다.
case 문도 distinct 하시면 똑같은 결과가 나올겁니다.

SELECT a.key1
     , DECODE(COUNT(DISTINCT col_a), 0, NULL, 1, MIN(col_a), 'multi') a 
     , DECODE(COUNT(DISTINCT col_b), 0, NULL, 1, MIN(col_b), 'multi') b
     , DECODE(COUNT(DISTINCT col_c), 0, NULL, 1, MIN(col_c), 'multi') c
  FROM mst a, dtl b
 WHERE a.key1 = b.key1 
 GROUP BY a.key1

by 잼따군 [2013.08.09 15:51:09]
감사합니다~!!! 정말 감사해요

by 미카엘 [2013.08.09 16:48:04]
저도 살짝함 올려 봅니다. ^^
WITH mst AS( SELECT 'key1' key1 FROM dual UNION ALL SELECT 'key2' key1 FROM dual UNION ALL SELECT 'key3' key1 FROM dual ), dtl AS( SELECT 'key1' key1, '01' key2, 'A' VAL FROM dual UNION ALL SELECT 'key1' key1, '02' key2, 'B' VAL FROM dual UNION ALL SELECT 'key1' key1, '03' key2, 'B' VAL FROM dual UNION ALL SELECT 'key1' key1, '03' key2, 'C' VAL FROM dual UNION ALL SELECT 'key2' key1, '01' key2, 'A' VAL FROM dual UNION ALL SELECT 'key2' key1, '02' key2, 'A' VAL FROM dual UNION ALL SELECT 'key3' key1, '01' key2, '' VAL FROM dual ) select a.key1, decode(sign(count(distinct b.val)-1), 0, min(b.val), 1, 'mulit') key_val from mst a, dtl b where a.key1 = b.key1 group by a.key1 ORDER BY a.key1
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입