mysql 조건에 따라 통계 후 통합 표시

개발 과정에서 겪은 일을 기록하고 다음과 같은 표 테스트가 있다고 가정한다.
id
num
time
1
123
2019-01-01 11:11:11
2
666
2019-01-01 11:11:11
타임은 어느 달의num 총수보다 작고 타임은 달의num수와 같다는 통계를 필요로 한다.
처음에는 하위 검색어를 사용하려고 했습니다.
SELECT
	SUM( a.num ) AS allSum,
	( SELECT SUM( b.num ) FROM test b WHERE DATE_FORMAT( b.time, '%Y%m' ) = '201901' ) AS monthSum 
FROM
	test a 
WHERE
	DATE_FORMAT( a.time, '%Y%m' ) <= '201901'

이렇게 하면 전체 시계를 두 번 스캔해야 하기 때문에 효율이 매우 떨어진다.
다음과 같이 케이스 when으로 변경했습니다.
SELECT
	SUM( CASE WHEN DATE_FORMAT( a.time, '%Y%m' ) <= '201901' THEN num ELSE 0 END ) AS allSum,
	SUM( CASE WHEN DATE_FORMAT( a.time, '%Y%m' ) = '201901' THEN num ELSE 0 END ) AS monthSum 
FROM
	test a

전체 시계를 한 번만 스캔하면 된다.
 
ps. [총수, 이달수] 형식의 문자열을 되돌려야 합니다. 원래는 sql에서 concat 연결을 사용하려고 했습니다. 예를 들어 다음과 같습니다.
SELECT
	CONCAT(
		'【',
		SUM( CASE WHEN DATE_FORMAT( a.time, '%Y%m' ) <= '201901' THEN num ELSE 0 END ),
		',',
		SUM( CASE WHEN DATE_FORMAT( a.time, '%Y%m' ) = '201901' THEN num ELSE 0 END ),
		'】' 
	) AS `result` 
FROM
	test a

검색 효율이 떨어지는 것을 발견하여 프로그램에서 연결하는 것으로 바꿀 수밖에 없었다.

좋은 웹페이지 즐겨찾기