피벗 쿼리를 짜는중입니다 0 11 2,576

by 성수다 [Tibero] pivot [2023.04.21 12:57:39]


안녕하세요 티베로로 피벗 쿼리를 짜는도중 막혀서 질문드립니다.
구 별로 건수를 피벗조회하는 쿼리인데
결과가 아래처럼 나옵니다 근데 저 남구라는곳에 정확한 지역을 알려줘야하는데 
현재 테이블에 전체 주소를 담고 있는 컬럼이 있는 상황이고 구 이름만 딴 컬럼도 있는상황입니다.
처음엔 case when gu_name = '남구' then substr('전체주소컬럼' , ) || gu_name 이런식으로 
앞에 지역명을 붙여주려고 했는데 쿼리 결과 개수가 달라지는게 문제입니다. 
또한 저 substring 값의 범위를 늘리면 쿼리 개수가 더 늘어나네요 뭐가 문제일까요?

원본 쿼리
SELECT *
		FROM  ( 
				SELECT replace(GU_NAME,' ', '') AS GU_NAME 
					 , CASE WHEN RMARK LIKE '야놀자%' THEN '야놀자' 
					   		WHEN RMARK IS NULL THEN '기타'
					   ELSE LOWER(RMARK) END as RMARK
				FROM  IN203T
			  )
		PIVOT (
				count(RMARK) FOR RMARK IN (  'bc카드' ,	 'k뱅크')
			  )
		ORDER BY GU_NAME;

가평군    0    0
강남구    0    3
강릉시    0    4
강북구    0    0
강서구    0    3
강화군    0    0
남구      0    4

 

수정시도

SELECT *
		FROM  ( 
				SELECT CASE WHEN GU_NAME = '남구' THEN substr(INSLOC,1, 2) || replace(GU_NAME,' ', '')
						 	ELSE replace(GU_NAME,' ', '') END AS GU_NAME  
					 , CASE WHEN RMARK LIKE '야놀자%' THEN '야놀자' 
					   		WHEN RMARK IS NULL THEN '기타'
					   ELSE LOWER(RMARK) END as RMARK
				FROM  IN203T
			  )
		PIVOT (
				count(RMARK) FOR RMARK IN (  'bc카드' ,	 'k뱅크')
			  )
		ORDER BY GU_NAME;

 

 

 

 

by 마농 [2023.04.21 13:17:15]

이름이 아닌 코드를 사용해야죠. (예 : gu_code, gu_name)
코드가 따로 없다면? 대분류부터 차례로 다 적어 주시면 됩니다. (예 : si_name, gu_name)
그리고 사용쿼리도 남구에 대해서는 떡히 문제는 없어 보이는데요? 결과가 틀리다고 생각하시는 건가요?
사용 쿼리에서 남구가 여러행으로 나뉘는 것은 정상일 듯 합니다.
다만, 남구 말고 중구 동구도 중복이 많긴 하므로 올바른 쿼리는 아닙니다.


by 성수다 [2023.04.21 13:20:30]

대분류부터 차례로 라는 말이 잘 이해되지 않습니다. ㅠㅠ 

올바른 쿼리가 있을까요?..


by 마농 [2023.04.21 13:47:55]

주소는 대분류(시도), 중분류(시군구), 소분류(읍면동,로) 형태의 계층 구조입니다.
중분류인 구군만 가지고 집계를 하면, 잘못된 결과가 나오게 됩니다.
광주 남구, 부산 남구, 울산 남구가 하나로 묶이게 됩니다.
대분류, 중분류 기준으로 집계를 해야 합니다.


by 마농 [2023.04.21 13:37:29]
-- 시도(지역) 항목이 있다면 그걸 이용하시면 되고, 없다면 만들어 사용하시면 됩니다.
SELECT *
  FROM (SELECT SUBSTR(insloc, 1, INSTR(insloc, ' ') - 1) si_name
             , REPLACE(gu_name, ' ') gu_name
             , CASE WHEN rmark LIKE '야놀자%' THEN '야놀자'
                    WHEN rmark IS NULL        THEN '기타'
                    ELSE LOWER(rmark) END rmark
          FROM in203t
        )
 PIVOT (COUNT(*) FOR rmark IN ('bc카드', 'k뱅크'))
 ORDER BY si_name, gu_name
;

 


by 성수다 [2023.04.21 13:47:49]

감사합니다!! 잘 활용하겠습니다.

혹시 컬럼 갯수가 차이나는 이유가 뭔가요?


by 마농 [2023.04.21 13:48:54]

컬럼 개수가 차이난다고 생각하시는 이유가 뭔가요?


by 성수다 [2023.04.21 13:54:05]

아 컬럼갯수가 아니라 쿼리 결과값 갯수 입니다


by 마농 [2023.04.21 14:01:36]

집계 기준이 달라지니 결과가 달라지는 것은 어쩌면 당연한 것입니다.
광주 남구, 부산 남구, 울산 남구가 하나의 남구로 잘못 묶여서 1줄에 10건이 나왔었다면?
광주 남구 3건, 부산 남구 5건, 울산 남구 2건 이렇게 3줄로 나뉘는 것이 원래 맞는 결과입니다.


by 성수다 [2023.04.21 14:06:48]

아 이해했습니다 감사합니다!


by 마농 [2023.04.21 14:09:42]

전체 주소가 우편번호 주소찾기 기능을 통해 자동 입력된 결과가 아닌 수기 입력된 결과라면?
서울시, 서울특별시, 서울., 경상남도, 경남 등등 입력방식이 제각각인지? 확인해 보세요.
예외처리가 필요합니다.


by 성수다 [2023.04.21 14:38:42]

네 확인해보겠습니다 감사합니다^,^ 

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