본문 바로가기

TIL 통합

1/15 기초 프로젝트ing join함수로 열(row)간 사칙연산하기, 입력물 형태의 중요성

프로젝트를 위한 자료 가공을 하던 도중 동별 성별, 연령별 인구수 통계표를 접했다. 자료를 쓰기 위해선 여성을 남성으로 나눠서 성비를 구하는 것이 관건인데, 이전까지 주로 접하던 자료들이 여, 남이 하나의 칼럼으로 집계된 것과는 달리 열로 기록되어 있었다.

그래서 어떻게 구해야하나 짱구를 한참 굴림.

윈도우 함수를 써야하나?

substr을 써서 별의 별 짓을 봐야하나..?

그런데 윈도우 함수는, 적어도 배운 범위 내에선 이 상황에서처럼 조건(계, 남, 여)을 걸어서 합산하는 방식이 불가능하지 않았나..?

 

 

 

그렇게 고민을 하고 또 고민을 하다가 간신히 join을 사용하는 방식이 생각이 났다.

그래서 작성한 쿼리는 다음과 같음

select 자치구,
	   f.`전  체` as 여성청년인구,
	   m.`전  체` as 남성청년인구,
	   round(f.`청년인구(19세이상 34세 이하)`/m.`청년인구(19세이상 34세 이하)`, 3) as '청년성비(여/남)',
	   f.청년인구비중,
	   round(f.`청년인구(19세이상 34세 이하)`/t.`청년인구(19세이상 34세 이하)`, 3) as 청년중여성비율,
	   m.`청년인구(19세이상 34세 이하)` as 청년인구,
	   t.`전  체` as 전체인구
from (select *
	  from youthbydistrictgender y 
	  where 성별 = '여') f
	  join
	  (select *
	  from youthbydistrictgender y 
      where 성별 = '남') m
      using(자치구)
      join
      (select *
      from youthbydistrictgender y 
      where 성별 = '계') t
      using(자치구)

그런데 무슨 결과값이 1000 나누기 800이 0.001 막 이런식으로 나왔음;;;

분명 칼럼간 일치는 제대로 됐는데 수 번을 다시 반복해서 해봐도 계속 마찬가지로 나옴.

 

그래서 오전에 튜터님께 여쭤보기라도 해야하나 싶었는데 결과물의 알파벳을 발견함.

정말 이것 때문인가 싶어서 혹여나 바꿔봤는데

select 자치구,
	   여성청년인구,
	   남성청년인구,
	   여성청년인구/남성청년인구 as '청년성비(여/남)'
from 
(
select f.자치구,
	   cast(replace(f.`청년인구(19-34)`, ',', '') as unsigned) as 여성청년인구,
	   cast(replace(m.`청년인구(19-34)`, ',', '') as unsigned) as 남성청년인구,
	   cast(replace(t.`청년인구(19-34)`, ',', '') as unsigned) as 총청년인구,
	   cast(replace(t.전체, ',', '') as unsigned) as 전체인구
from (select *
	  from youthbydistrictgender y 
	  where 성별 = '여') f
	  join
	  (select *
	  from youthbydistrictgender y 
      where 성별 = '남') m
      on f.자치구 = m.자치구
      join
      (select *
      from youthbydistrictgender y 
      where 성별 = '계') t
      on f.자치구=t.자치구
)a

결과는 정말로 이것 때문이었다.

 

아니 애초에 문자라고 이상하게 사칙연산 될 거면 그냥 되지를 말던가...

아무튼 허무하지만 값진 교훈을 얻었다.

날짜는 애초에 date 형식이 아니면 가공 자체가 안 되는데,

단순히 문자로 입력된 숫자는 애매하게 계산이 되긴 할 줄은 전혀 생각지 못했다.

SQL에서 입력물의 형태가 중요하단 것을 다시 절감함.