초보 쿼리 질문 드립니다. 풀릴것 같으면서 안풀리네요 ㅠㅠ 0 3 2,902

by 뉴초보 [SQL Query] DECODE CASE [2014.10.27 16:31:44]


일단 확인하시기 편하게 WITH 문을 이용하여 기본 데이터를 만들어 보았습니다.

 

WITH TB_SAMPLE AS (
SELECT	TO_CHAR(SYSDATE - 1 , 'YYYYMMDD')	AS SAMPLE_DT,
		'H'									AS SAMPLE_TYPE,
        '책상'								AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 2 , 'YYYYMMDD')	AS SAMPLE_DT,
		'H'									AS SAMPLE_TYPE,
        '책상'								AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 1 , 'YYYYMMDD')	AS SAMPLE_DT,
		'Z'									AS SAMPLE_TYPE,
        '칠판'								AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 3 , 'YYYYMMDD')	AS SAMPLE_DT,
		'H'									AS SAMPLE_TYPE,
        '의자'									AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 6 , 'YYYYMMDD')	AS SAMPLE_DT,
		'A'									AS SAMPLE_TYPE,
        '학생'									AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 3 , 'YYYYMMDD')	AS SAMPLE_DT,
		'A'									AS SAMPLE_TYPE,
        '선생'									AS SAMPLE_NAME
FROM DUAL
)
SELECT	*
FROM	TB_SAMPLE

 

위 쿼리 문을 복사하셔서 sql 창에 붙여넣고 돌리시면 아래와 같이 데이터가 조회 됩니다.

 

SAMPLE_DT    SAMPLE_TYPE    SAMPLE_NAME

20141026    H    책상
20141025    H    책상
20141026    Z    칠판
20141024    H    의자
20141021    A    학생
20141024    A    선생

 

 

이 데이터 중에 SAMPLE_TYPE 값이 'H' 인 행의 수를 구하려고 합니다.

 

현재 SUM 과 DECODE 이용하여 행의 수를 구해 보았습니다.

 

WITH TB_SAMPLE AS (

SELECT	TO_CHAR(SYSDATE - 1 , 'YYYYMMDD')	AS SAMPLE_DT,
		'H'									AS SAMPLE_TYPE,
        '책상'								AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 2 , 'YYYYMMDD')	AS SAMPLE_DT,
		'H'									AS SAMPLE_TYPE,
        '책상'								AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 1 , 'YYYYMMDD')	AS SAMPLE_DT,
		'Z'									AS SAMPLE_TYPE,
        '칠판'								AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 3 , 'YYYYMMDD')	AS SAMPLE_DT,
		'H'									AS SAMPLE_TYPE,
        '의자'									AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 6 , 'YYYYMMDD')	AS SAMPLE_DT,
		'A'									AS SAMPLE_TYPE,
        '학생'									AS SAMPLE_NAME
FROM DUAL
UNION ALL
SELECT	TO_CHAR(SYSDATE - 3 , 'YYYYMMDD')	AS SAMPLE_DT,
		'A'									AS SAMPLE_TYPE,
        '선생'									AS SAMPLE_NAME
FROM DUAL
)
SELECT	SUM(DECODE(SAMPLE_TYPE, 'H', 1, 0)) AS SAMPLE_SUM
FROM	TB_SAMPLE

 

 

이렇게 작성하여 조회하게 되면 SAMPLE_SUM 의 값이 3이 나옵니다.

 

여기서 추가적으로 SAMPLE_TYPE 값이 'H' 이고

 

SAMPLE_NAME 중복이라면 중복된 값을 1로 처리하여 조회하고 싶습니다.

 

20141026    H    책상  <--중복
20141025    H    책상  <--중복
20141024    H    의자
 

SAMPLE_TYPE 값이 H 인것만 조회하면 3건이지만 

SAMPLE_NAME 값이 중복건이 있어 이 중복건을 한건으로 처리하여

 

총 행의수가 2가 나왔으면 합니다....

 

굉장히 쉬울것 같은데....잘 안풀리네요 ㅠㅠ 답변 부탁 드리겠습니다.

by 빈이 [2014.10.27 17:35:32]

SELECT MIN(SAMPLE_DT) AS MIN_SMAPLE_DT, MAX(SAMPLE_DT) AS MAX_SMAPLE_DT, SAMPLE_TYPE, SAMPLE_NAME
  FROM TB_SAMPLE
WHERE SAMPLE_TYPE = 'H'
GROUP BY SAMPLE_TYPE, SAMPLE_NAME

DT가 나와야 한다면 젤 작은값(MIN)을 뽑을지 큰값(MAX)을 뽑을지 선택하시구요...

DT가 필요없다면 걍 지우세요


by 뉴초보 [2014.10.27 18:26:47]

아...........MIN / MAX ................

저게 있었군요 ㅠㅠ 

답변 정말 감사드립니다!!


by 보이는손 [2014.10.30 11:34:42]
SELECT COUNT(DISTINCT sample_name) cnt
  FROM tb_sample
 WHERE sample_type = 'H'
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입