1

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 行を取得し、残りをグループ化する必要があります。

これを1つのクエリで解決する方法はありますか?

4

2 に答える 2

0

これは 1 つのクエリで実行できますが、サブクエリが必要です (最終的には、何らかの方法で、既にグループ化されたデータをグループ化する必要があります)。これは、MySQL 固有の方法の 1 つです。変数を使用して行にシーケンス番号を追加し、それをグループ化に使用します。

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)
于 2013-05-07T01:54:11.787 に答える
0

解決済み:

@Gordon Linoff のコンセプトを採用し、これと混ぜ合わせまし
@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

これが誰かに役立つことを願っています。助けてくれてありがとう。

于 2013-05-07T08:03:39.323 に答える