서론

월/주차 별로 통계를 내야하는 페이지가 있었다. 

내가 만들고 싶었던 것 =  11월 4주차, 11월 5주차 와 같이 월/주차를 구해서 표현하고, 통계를 내고 싶었다.


첨에는 week() 함수, weekofyear()함수를 사용해서 group by 해서 통계페이지를 냈다. 

그런데 52, 27등으로 표현되는 주차를 어떻게 12월 5주차, 1월 2주차 등으로 보여줄지 모르겠어서 (조금) 헤맸다.

막 꼬여가지고 13월 1주차 나오고 그랬다.. 


결론은 

이렇게 짰다.

월 구하기

월은 month()를 이용해서 구할 수 있다.
select month(구하고자 하는 날짜 컬럼) from 테이블;

주차 구하기

주차는 weekofyear()를 사용해서 구할 수 있다. 
다만, 내가 원하는 주차는 단순히 '53주차' 가 아니라 12월 28일이 12월의 4주차인지 5주차인지 1주차인지에 해당하는 것이었다. 그래서 다음과 같이 쿼리를 짰다.
select weekofyear(구하고자 하는 날짜) - weekofyear(구하고자 하는 달의 첫째날) + 1 from 테이블

요런식으로 weekofyear(대상 날짜) - weekofyear(해당 달의 첫째날) + 1(해당 날짜의 주차 - 해당 달의 첫째날 의 주차 + 1) 로 계산하면 문제없이 원하는 m주차를 뽑아 낼 수 있다.


최종본

내가 최종적으로 원한 것은 월, 주차 별로 통계를 뽑아내는 것이었다. 그래서 concat한 뒤에 group by를 해서 뽑아냈다. 

select  concat(month(구하고자 하는 날짜), '월 ', weekofyear(구하고자 하는 날짜) - weekofyear(해당 달의 첫째날) +1, '주차' ) as monthWeek from 테이블 

group by monthWeek;


후일담

뭐 일단은 만들어두긴 했는데, 나중에 보고나니 '통계를 내는 부분' 은 좋은 쿼리가 아니다. 그 이유는 인덱스를 타지도 않고 concat해놓은 스트링으로 새로운 컬럼을 만들어서 group by를 시켰으니 뭐 explain 떠보지 않더라도 완전 안좋을 거라는 예감이 폴폴폴폴폴폴 난다... 나중에 눈치봐서 저 쿼리를 개선하도록 해봐야겠다. 몰래.. 몰래.. ^_^ ;; 

'개발개발 > mySql' 카테고리의 다른 글

insert와 bulk insert 무엇을 써야할까요?  (1) 2018.10.04
DB를 쿼리로 업데이트 할때  (0) 2018.09.16
left join 시 속도 문제  (0) 2016.12.20
SELECT 정렬하기 정리  (0) 2016.12.13
order by varchar to int  (0) 2016.11.24

+ Recent posts