2010-05-26 2 views
21

계정에 여러 레코드가있는 계정 테이블과 레코드 테이블이 있습니다. 나는 "기록의 수"범위로 계좌 총액을 나누고 싶습니다. 나는.MySQL 및 CASE WHEN 값 범위가

Count of Records | Count 
========================= 
0-25 | 100 
25 - 50 | 122 
50 - 100 | 300 

의 붕괴 등

나는 다음과 같은 쿼리를 사용하고

보기,하지만 난 내가 원하는 것입니다 "GRP"가장 좋은 방법에 어떤 도움에 의해 그룹에 얻을 수 없다 검색어 수정?

SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id 
    ORDER BY ct 

답변

19

이 시도 :

SELECT count(*) as ct, 
CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' 
END AS grp 
FROM records r, accounts a 
WHERE r.account_id=a.id 
GROUP BY r.account_id, a.id, 
    CASE 
    WHEN COUNT(*) < 25 THEN '1-25' 
    WHEN COUNT(*) >= 25 < 50 THEN '25-50' 
    WHEN COUNT(*) >= 50 < 100 THEN '50-100' 
    WHEN COUNT(*) >= 100 < 250 THEN '100-250' 
    WHEN COUNT(*) >= 250 < 500 THEN '250-500' 
    WHEN COUNT(*) >= 500 < 1000 THEN '500-1000' 
    ELSE '1000+' END 
ORDER BY count(*) 

당신은 당신이에 원래 데이터 행을 집계 할 '버킷을 ""정의 "해야 ...이 GROUP BY 절을위한 것입니다 .. 베이스 테이블의 각 행을 분석하여 데이터의 "버킷"을 집계하는 기준을 결정합니다. group by 절에 정의 된 표현식은 해당 버킷의 "정의"입니다.

쿼리가 원래 데이터 행을 처리 할 때이 표현식의 값이 기존 버킷과 동일한 모든 행이 해당 버킷에 집계됩니다. 값이 아닌 새 행 기존 버킷으로 표현하면 새 버킷이 만들어집니다. ...

+2

내가 얻을 ERROR 1111 (HY000) : 그룹 기능의 사용이 잘못되었습니다 내가 MySQL은 5.1 감사를 사용하고 ! – kickdaddy

+0

죄송 합니다만, SQL 쿼리의 주요 부분에서'r.Account_id'와'a.id' 열을 사용하기 때문에 Group By 절에도 이들을 포함시켜야합니다 ... 모든 열 또는 표현식이 t9o를 참조했습니다. 집계 함수 (Sum, Avg, Min, Max 등)가 아닌 쿼리의 기본 (사전 집계) 부분에있는 Bye 그룹에 언급되어야합니다. –

+0

GROUP BY 절 내부에서 COUNT (*)를 사용하는 방법을 알지 못합니다. 이것은 가능한가? –

6

하위 쿼리가 필요합니다. 이것이보기라면 두 개의보기를 사용해야합니다.

SELECT s.ct, s.grp FROM ( 
SELECT count(*) as ct, 
    CASE 
     WHEN COUNT(*) < 25 THEN '1-25' 
     WHEN COUNT(*) >= 25 AND COUNT(*) < 50 THEN '25-50' 
     WHEN COUNT(*) >= 50 AND COUNT(*) < 100 THEN '50-100' 
     WHEN COUNT(*) >= 100 AND COUNT(*) < 250 THEN '100-250' 
     WHEN COUNT(*) >= 250 AND COUNT(*) < 500 THEN '250-500' 
     WHEN COUNT(*) >= 500 AND COUNT(*) < 1000 THEN '500-1000' 
     ELSE '1000+' 
    END AS grp 
    FROM records r,accounts a 
    WHERE r.account_id=a.id) as s 

Group BY s.grp; 
관련 문제