728x90

쿼리를 짜는 도중 새로운 방법을 하나 배웠다.

COUNT에 CASE WHEN 으로 조건 넣기

쿼리 결과


COUNT(CASE WHEN 조건 THEN 컬럼 END)

FILE의 여부와 개수에 따라 '완비', '미비', '해당사항 없음'이 출력된다.

 

테이블 데이터 현황


▷ 마스터 테이블

DOCUMNET
A
B
C

 

▷ 디테일 테이블

DOC ID FILE
A 1 Y
A 2 Y
A 3 Y
B 1 Y
B 2 N
더보기
마스터 테이블
디테일 테이블

 

쿼리 조건


1. 마스터 테이블과 디테일 테이블을 조인한다. (단, 출력 결과는 마스터 테이블 개수와 동일해야한다.)
2. 디테일 테이블에서 FILE 컬럼에 파일 여부가 전부 Y면 '완비', N이 하나라도 있다면 '미비', 디테일 테이블이 없다면 '해당사항없음'으로 출력한다.

 

 

쿼리 구현


SELECT M.DOCUMENT
	 , CASE WHEN D.NFILE > 0 THEN '미비'
	 		WHEN D.NFILE = 0 THEN '완비'
	        ELSE '해당사항 없음'
	        END FILE_YN
	 , D.YFILE
	 , D.NFILE
  FROM MASTER M
  LEFT OUTER JOIN (
  					SELECT DOC
  						 , COUNT(CASE WHEN FILE='Y' THEN FILE END) AS YFILE
  						 , COUNT(CASE WHEN FILE='N' THEN FILE END) AS NFILE
  					  FROM DETAIL
  					 GROUP BY DOC
  				  ) D ON M.DOCUMENT = D.DOC

COUNT안에 CASE WHEN을 넣어 조건에 해당하는 것만 카운팅 되도록 한다.

 

전체 쿼리


WITH MASTER AS (
	SELECT 'A' AS DOCUMENT FROM DUAL
	UNION ALL
	SELECT 'B' AS DOCUMENT FROM DUAL
	UNION ALL
	SELECT 'C' AS DOCUMENT FROM DUAL
), DETAIL AS (
	SELECT 'A' AS DOC
		 , 1 AS ID
		 , 'Y' AS FILE
	  FROM DUAL
	 UNION ALL
	SELECT 'A' AS DOC
		 , 2 AS ID
		 , 'Y' AS FILE
	  FROM DUAL
	 UNION ALL
	SELECT 'A' AS DOC
		 , 3 AS ID
		 , 'Y' AS FILE
	  FROM DUAL
	 UNION ALL
	SELECT 'B' AS DOC
		 , 1 AS ID
		 , 'Y' AS FILE
	  FROM DUAL
	 UNION ALL
	SELECT 'B' AS DOC
		 , 2 AS ID
		 , 'N' AS FILE
	  FROM DUAL
)
SELECT M.DOCUMENT
	 , CASE WHEN D.NFILE > 0 THEN '미비'
	 		WHEN D.NFILE = 0 THEN '완비'
	        ELSE '해당사항 없음'
	        END FILE_YN
	 , D.YFILE
	 , D.NFILE
  FROM MASTER M
  LEFT OUTER JOIN (
  					SELECT DOC
  						 , COUNT(CASE WHEN FILE='Y' THEN FILE END) AS YFILE
  						 , COUNT(CASE WHEN FILE='N' THEN FILE END) AS NFILE
  					  FROM DETAIL
  					 GROUP BY DOC
  				  ) D ON M.DOCUMENT = D.DOC
728x90

+ Recent posts