2012-11-23 6 views
0

아래의 MySQL 문을 모듈 이름 (현재와 같이)로 주문하려고합니다. 그러나 날짜 범위에 포함 된 모든 module_type에 대해 COUNT까지의 상위 50 개 모듈 만 포함하십시오 걱정이다. 내가 그 일을 어떻게 할 것인지에 대한 아이디어가 있습니까? 예. 모듈의 모든 '카운트'의 1 월, 2 월, 3 월에 대한 합계가 다른 모듈에 대한 것보다 높으면 해당 모듈에 대한 3 개월 모두 다른 레코드 위에 올 것입니다.가장 큰 총계 월별 그룹

엄청나게 많은 시간이 걸릴 것으로 보입니다.

SELECT 
    DATE_FORMAT(tbl_client_modules.c_module_month, '%b %y') AS MONTH, 
    tbl_modules.module_name, 
    count(tbl_client_modules.c_module_type), 
    tbl_client_modules.c_module_type AS MOD_TYPE 
FROM 
    tbl_client_details 
    LEFT OUTER JOIN tbl_client_status ON tbl_client_details.cd_status = tbl_client_status.cl_status_id 
    LEFT OUTER JOIN tbl_client_modules ON tbl_client_details.cd_ZBI_no = tbl_client_modules.cl_module_zbi AND tbl_client_details.cd_UCN = tbl_client_modules.c_module_UCN AND tbl_client_details.cd_co_code = tbl_client_modules.c_module_co_code 
    LEFT OUTER JOIN tbl_modules ON tbl_client_modules.c_module_type = tbl_modules.module_id 
WHERE 
    tbl_client_details.cd_removed_date is null 
    AND TRIM(tbl_client_details.cd_client_name) <> '' 
    AND (tbl_client_details.cd_region = 'WC') 
    AND (tbl_client_modules.c_module_month >= '2012-07-01' AND tbl_client_modules.c_module_month <= '2012-10-30') 
    AND tbl_client_modules.c_module_vol > 0 
GROUP BY tbl_client_modules.c_module_month, tbl_client_modules.c_module_type 
ORDER BY tbl_modules.module_name; 

인덱스 :

tbl_client_details, 0, PRIMARY,  1, cd_id, A, , , , , BTREE, , 
tbl_client_details, 0, PRIMARY,  2, cd_ucn, A, , , , , BTREE, , 
tbl_client_details, 0, PRIMARY,  3, cd_ZBI_no, A, 55351, , , , BTREE, , 
tbl_client_details, 1, cd_ucn,   1, cd_ucn, A, 55351, , , , BTREE, , 
tbl_client_details, 1, cd_opm,   1, cd_OPM, A, 321, , , YES, BTREE, , 
tbl_client_details, 1, cd_zbi_no,  1, cd_ZBI_no, A, 55351, , , , BTREE, , 
tbl_client_details, 1, cd_cpe_rm_code, 1, cd_cpe_rm_code, A, 1729, , , YES, BTREE, , 
tbl_client_details, 1, cd_sic_code, 1, cd_sic_code, A, 802, , , YES, BTREE, , 
tbl_client_details, 1, cd_enrol_date, 1, cd_enrol_date, A, 13837, , , YES, BTREE, , 
tbl_client_details, 1, cd_co_code,  1, cd_co_code, A, 8, , , YES, BTREE, , 
tbl_client_details, 1, cd_client_name, 1, cd_client_name, A, 55351, , , YES, BTREE, , 
tbl_client_details, 1, cd_segment,  1, cd_segment, A, 36, , , , BTREE, , 
tbl_client_details, 1, cd_region,  1, cd_region, A, 18, , , YES, BTREE, , 
tbl_client_details, 1, cd_status,  1, cd_status, A, 295, , , YES, BTREE, , 

tbl_client_status, 0, PRIMARY,  1, cl_status_id, A, 32, , , , BTREE, , 
tbl_client_status, 1, cl_status_id, 1, cl_status_id, A, 32, , , , BTREE, , 

tbl_client_modules, 0, PRIMARY,   1, cl_module_id, A, 12135739, , , , BTREE, , 
tbl_client_modules, 1, cl_module_zbi, 1, cl_module_zbi, A, 53697, , , , BTREE, , 
tbl_client_modules, 1, c_module_type, 1, c_module_type, A, 104, , , , BTREE, , 
tbl_client_modules, 1, c_module_month, 1, c_module_month, A, 27, , , YES, BTREE, , 
tbl_client_modules, 1, c_module_ucn,  1, c_module_ucn, A, 63872, , , YES, BTREE, , 
tbl_client_modules, 1, c_module_co_code, 1, c_module_co_code, A, 9, , , YES, BTREE, , 
tbl_client_modules, 1, c_module_vol,  1, c_module_vol, A, 32020, , , YES, BTREE, , 

tbl_modules,  0, PRIMARY,  1, module_id, A, 109, , , , BTREE, , 
tbl_modules,  1, module_id,  1, module_id, A, 109, , , , BTREE, , 
tbl_modules,  1, module_tab,  1, module_tab, A, 9, , , YES, BTREE, , 
+0

GROUP BY를 GROUP BY DATE_FORMAT (c_module_month, '% b % y'), module_name, c_module_type'으로 변경해보십시오. MySQL은 GROUP BY 설정에서 끔찍한 오판을 가지고 있습니다. –

+0

또한 테이블 이름으로 필드 이름을 수식하지 않았기 때문에이 쿼리의 진행 상황을 알기 어렵습니다. 색인은 어디에 있습니까? 또한 c_module_month 열에 첫 번째 달을 나타내는 값만있는 경우 DATE_FORMAT 호출을 제거하여 속도를 높일 수 있습니다. –

+0

정규화 된 필드 이름 및 표시된 인덱스를 감사드립니다. 나는 제안에 의해 그룹을 다시 시도 할 것이다. 나는 일찍 시도했지만 제대로 작동시키지 못했습니다. – Eishman

답변

0

내가 볼 수있는 기능 내가 원하는 일을한다 '롤업'가. 다음 캐치는 이것을 정렬하는 방법을 찾는다. 여기에서 그 도전에 대한 답이 있습니다 : sort the "rollup" in group by