decode 조회 결과에 대한 질문입니다- 0 9 2,767

by imilly [SQL Query] decode [2013.10.10 08:57:24]


-- 안녕하십니까- 혼자서는 답이 안나와서 질문 남깁니다. 도움 부탁드립니다
--지금 이렇게 sql문을 짰는데

SELECT A.NAME 소프트웨어명,
 DECODE(SUBSTR(D.GUBN, 1, 2), '10', COUNT(B.CODE), 0) 그룹1, 
 DECODE(SUBSTR(D.GUBN, 1, 2), '20', COUNT(B.CODE), 0) 그룹2, 
 DECODE(SUBSTR(D.GUBN, 1, 2), '30', COUNT(B.CODE), 0) 그룹3,
 DECODE(SUBSTR(D.GUBN, 1, 2), '40', COUNT(B.CODE), 0) 그룹4,
 DECODE(SUBSTR(D.GUBN, 1, 2), '50', COUNT(B.CODE), 0) 그룹5
FROM SFTWA A, SFTWB B, INSA C, DEPT D
WHERE A.CODE = B.CODE AND
 B.USER = C.EMPL AND
 C.CODE = D.CODE
GROUP BY D.GUBN, A.NAME
ORDER BY A.NAME ASC;

이 상태로 조회가 되기는 됩니다. 문제는, 결과가

소프트웨어명 그룹1 그룹2 그룹3 그룹4 그룹5
---------------------------------------------------------------
소프트웨어1 0 1 0 0 0
소프트웨어1 3 0 0 0 0
소프트웨어1 0 0 5 0 0
소프트웨어1 0 0 0 0 2
소프트웨어2 6 0 0 0 0
소프트웨어2 0 11 0 0 0
.
.
.

이런식으로 조회가 되는데요. 제가 원하는 건

소프트웨어명 그룹1 그룹2 그룹3 그룹4 그룹5
---------------------------------------------------------------
소프트웨어1 3 1 5 0 2
소프트웨어2 6 11 0 0 0
소프트웨어3 5 8 3 6 17


이런식으로 결과를 출력하고 싶습니다.

어느 부분을 어떻게 수정해보면 좋을지 조언 좀 부탁드립니다. sql이 완전히 잘못 되었나요? 설명을 잘 했는지 모르겠네요. 오늘도 좋은 하루들 보내시길-
by 우리집아찌 [2013.10.10 09:00:07]

DECODE 앞에 MAX 나 MIN 으로 싸주세요.

by imilly [2013.10.10 09:04:36]

헐 감사합니다 아찌님

MAX 붙여보니까 그룹함수 문제가 생겨서 고민했었는데 지금 말씀듣고 다시 해서 해결했습니다

감사합니다 ㅎ


by imilly [2013.10.10 09:09:56]

근데 이렇게 하니까

소프트웨어1   3  1  5  0  2
소프트웨어2   6 11 0  0  0
소프트웨어3   5  8  3  6  17

이런식으로 나오는게 아니라

소프트웨어200   4  5  1  0  9

이렇게 한 개의 로우만 반환되네요. 첫 번 째 로우부터 마지막 로우까지 한 번에 출력할 수는 없을까요?


by 우리집아찌 [2013.10.10 09:19:35]
소프트웨어명으로 그룹핑해주세요

by imilly [2013.10.10 09:30:30]

소프트웨어명으로 그룹핑했는데도 그러네요.

뭔가 될듯 될듯 한데 ㅎㅎ 남은 부분은 제가 좀 더 고민해 보겠습니다.

도움주셔서 정말 감사합니다-


by 아발란체 [2013.10.10 09:52:20]
아니면 쉽게, 구하신 결과를 SELECT * FROM () 로 감싸서 소프트웨어명으로 그룹 바이하여 결과를 확인하시는 것은 어떨까용.

SELECT 소프트웨어명, MAX(그룹1), MAX(그룹2)... FROM (기존 쿼리) GROUP BY 소프트웨어명

by imilly [2013.10.10 11:21:48]

고민하다가 이 방식으로 어떻게 하게됐습니다. 소 개구리 밟는 격으로 됐는데
아발란체님 댓글이 바로 그거네요- 감사합니다 해놓고도 댓글보고 이해가 됐어요 ㅎ


by 마농 [2013.10.10 10:03:19]
-- 1. 그룹바이 항목에서 구분을 빼셔야 하구요
-- 2. Decode(Count)가 아닌 Count(Decode) 하셔야 하구요
-- 3. 카운트하는데 굳이 컬럼을 카운트할 필요는 없습니다.
SELECT a.name 소프트웨어명
     , COUNT(DECODE(SUBSTR(d.gubn, 1, 2), '10', 1)) 그룹1
     , COUNT(DECODE(SUBSTR(d.gubn, 1, 2), '20', 1)) 그룹2
     , COUNT(DECODE(SUBSTR(d.gubn, 1, 2), '30', 1)) 그룹3
     , COUNT(DECODE(SUBSTR(d.gubn, 1, 2), '40', 1)) 그룹4
     , COUNT(DECODE(SUBSTR(d.gubn, 1, 2), '50', 1)) 그룹5
  FROM sftwa a
     , sftwb b
     , insa c
     , dept d
 WHERE a.code = b.code
   AND b.user = c.empl
   AND c.code = d.code
 GROUP BY a.name
 ORDER BY a.name
;

by imilly [2013.10.10 11:24:01]
허 완벽한 정리네요 decode, count 생각도 못했습니다 생각나는대로 짜다보니

바로 말씀해주신대로 정리해보겠습니다. 마농님 감사합니다-
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입