MySQL에서 월별 통게를 구하고 싶습니다 0 2 1,172

by 김종영 [MySQL] mysql 통계 [2021.04.11 22:01:14]


캡처.PNG (22,375Bytes)

저의 최종 목표는 월별: 도시별 방문자 통계를 내는 것인데, 어떻게 접근해야 할지 도저히 감이 안 잡혀서 질문 드립니다.

사진에서 group by로 schedule_content(도시)끼리 묶고 COUNT(schedule_content)와 latitude, longitude 컬럼을 추가시키는 것, 그리고 그것을 월별로 빼오는 것이 되겠는데요... 

 

테이블에 대한 설명을 드리자면 일정은 schedule_date 컬럼, schedule_type_id라는 컬럼에서는 1~4까지의 id값을 할당하여 도시 이름 / 숙소 이름 / 교통 수단 / 세부적인 관광지 이름을 구분하고, schedule_content에서 해당 내용을 출력하고 있습니다. 그 중 도시 이름은 schedule_type_id = 1이고요.

따라서 원하는 월별(도시별) 방문자 통계를 내기 위해서 아래와 같이 where schedule_type_id = 1 조건을 주고, group by 조건을 주었는데...

select schedule_date, count(schedule_content), schedule_content, latitude, longitude from schedule where schedule_type_id = 1 group by schedule_content

아래와 같은 에러를 띄웁니다.

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'gadadb.schedule.schedule_date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

only_full_group_by 키워드로 서치를 해보니 "HAVING이나 ORDER BY목록이 GROUP BY절 에서 명명 되지 않았거나 기능적으로 종속되지 않은 집계되지 않은 열을 참조 하는 쿼리를 거부하도록 되어 있습니다."라는데, 무슨 의미인지 잘 이해가 되지 않네요.

group by를 사용하기 위해서는 여기서 더 다른 조건을 주어야 하는 걸까요? 

 

그리고 월별(년도 상관없이) 통계를 내기 위해선 월별로도 group by 조건을 주어야 할텐데, 이런 경우엔 어떻게 해야할까요?

select month('schedule_date') ...  schedule_type_id = 1 group by schedule_content and schedule_date와 같은 식으로 출력할 수 있을까요? 혹시 더 효율적인 방법이 있을지 궁금합니다.

 

감사합니다.

by 마농 [2021.04.12 11:28:12]

1. 원하는 것이 도시별, 월별 통계라면?
- 쿼리는 다음과 같은 형태가 될 것입니다.
- SELECT 도시, 월, COUNT(*) 건수 FROM t GROUP BY 도시, 월;
2. 그런데 여기에 다른 항목이 추가될 이유가 있나요?
- 도시별 월별 한줄로 집계된 자료와
- 여러줄이 나오는 다른 개별 내역이 함께 조회된다는게 상식적으로 불가능한 일입니다.
- only_full_group_by 는 이러한 상식을 파괴하고 오류를 무시하는 옵션입니다.
- 이는 해결책이 아닙니다. 상식적으로 논리적으로 타당해야 합니다.
3. 현재 예시 자료를 보면
- schedule_content(지역) 별 중복되는게 속초시 하나이고
- 중복되는 속초시 두 날짜의 위도와, 경도가 동일한 것으로 보이네요?
- 생플이 너무 적어서 확실하지 않아 두가지 경우를 생각할 수 있는데.
- 1번) 각 도시는 항상 같은 위,경도를 가진다고 한다면?
- 그룹바이에 위, 경도도 포함시키면 됩니다.
- SELECT 도시, 월, 위도, 경도, COUNT(*) 건수 FROM t GROUP BY 도시, 월, 위도, 경도;
- 2번) 만약 각 도시가 일자에 따라 위.경도가 다르게 나올 수도 있다면?
- 그룹바이에 추가하는 방식은 안되고 집계함수(MIN, MAX 등)와 함께 사용해야 합니다.
- 다만 이 방식이 에러 회피를 목적으로 해서는 안되고 실제 필요에 의해서 해야 합니다.
- 그런데 위,경도를 집계함수와 사용하는게 의미가 있는지 모르겠네요?


by 에어버스 [2021.04.12 11:48:57]

1. 위도와 경도는 COUNT 값을 지도에 표시하기 위해서 포함시는 것입니다.

2. 각 지역은 항상(고유의) 동일한 위도와 경도 값을 갖습니다.

질문이 많이 횡설수설했네요... 죄송합니다.

답변 참고해서 값 잘 뽑아보겠습니다. 감사합니다!

 

그리고 2번 답변은 꼭 명심하겠습니다.

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