2013-05-07 3 views
1

MySQL 데이터로 원형 차트를 그려야합니다. 첫 번째 n 행을 검색하고 나머지는 그룹화해야합니다.
첫 번째 쿼리가 이미 그룹화되어있는 것이 문제입니다. MySQL은 첫 번째 n 개의 행을 반환하고 나머지는 그룹화합니다.

SELECT name AS especie, SUM(superficie) AS superficie 
FROM ciclos 
JOIN cultivos ON id_cultivo = idcultivo 
JOIN tbl_especies ON id_especie = idespecie 
WHERE fecha_cierre IS NULL 
GROUP BY id_especie 
ORDER BY superficie DESC 

내가 무엇을 얻을 수 있습니다 :

+------------+------------+ 
| Especie | Superficie | 
+------------+------------+ 
| Avena  | 50.0000 | 
| Centeno | 32.4000 | 
| Trigo  | 18.0000 | 
| Almendros | 5.1100  | 
| Olivos  | 4.7000  | 
| Vid  | 1.8300  | 
| Nogal  | 0.3500  | 
| Cerezo  | 0.2500  | 
+------------+------------+ 

그리고 이것은 내가 필요한 것입니다 :

이 경우
+------------+------------+ 
| Especie | Superficie | 
+------------+------------+ 
| Avena  | 50.0000 | 
| Centeno | 32.4000 | 
| Trigo  | 18.0000 | 
| Almendros | 5.1100  | 
| Rest  | 7.1300  | 
+------------+------------+ 

, 나는 처음 4 행과 그룹에 나머지를 검색해야 .

하나의 검색어로이를 해결할 수있는 방법이 있습니까?

답변

0

:

나는 @Gordon Linoff 개념을 가져다 this로 혼합.
@ Gordon Linoff 솔루션의 문제점은 주문 중에 행 번호가 추가된다는 것입니다.

SELECT @rn := @rn + 1 AS rn, SUM(superficie) AS superficie, (CASE WHEN @rn <= 4 THEN name ELSE "Other" END) AS especie 
FROM (
    SELECT name, SUM(superficie) AS superficie 
    FROM ciclos 
    JOIN cultivos ON id_cultivo = idcultivo 
    JOIN tbl_especies ON id_especie = idespecie 
    WHERE fecha_cierre IS NULL 
    GROUP BY id_especie 
    ORDER BY superficie DESC 
) AS temp 
CROSS JOIN (SELECT @rn := 0) AS const 
GROUP BY (CASE WHEN @rn <= 4 THEN name ELSE "Other" END) 
ORDER BY superficie DESC 

희망이 사람을 도움이됩니다. 도와 주셔서 감사합니다.

0

하나의 쿼리로이 작업을 수행 할 수 있지만 하위 쿼리가 필요합니다. 결국에는 그룹화 된 데이터를 그룹화해야합니다. 여기에 하나의 MySQL 관련 방법이 있습니다. 이 변수를 사용하여 행에 일련 번호를 추가 한 다음 그룹에 대한 것을 사용하여 해결하고자

select (case when rn <= 4 then especie else 'otros' end) as grouping, 
     sum(superficie) as superficie 
from (SELECT name AS especie, SUM(superficie) AS superficie, @rn := @rn + 1 as rn 
     FROM ciclos 
     JOIN cultivos ON id_cultivo = idcultivo 
     JOIN tbl_especies ON id_especie = idespecie 
     cross join (select @rn := 0) const 
     WHERE fecha_cierre IS NULL 
     GROUP BY id_especie 
     ORDER BY superficie DESC 
    ) t 
group by (case when rn <= 4 then especie else 'otros' end) 
+0

응답 해 주셔서 감사합니다. 쿼리를 이해하지만 구문 오류가 발생했습니다 : "@rn : = 0) const WHERE ..."및 이유를 모르겠습니다. –

+0

CROSS JOIN : CROSS JOIN (SELECT @rn : = 0) const 내에 "SELECT"가 누락되었습니다. 이제 문제는 처음 4 행을 얻지 만 "슈퍼 피시 (superficie)"에 의한 주문이 아니라는 것입니다. 사실, 내가 필요로하는 것은 "Superficie"가 4보다 낮은 모든 "Especies"를 그룹화하는 것입니다. –

관련 문제