我如何在MySQL中进行子分组?

时间:2012-02-02 22:54:32

标签: mysql sql

假设我有这个数据集:

id   city   result fruit
1    boston good   apple
2    boston bad    banana
3    ny     good   peach
4    ny     good   banana
5    ny     good   apple
6    ny     bad    apple
...

所以想象一下,这个数据集会继续存在,并且可以为任意数量的水果和任意数量的城市提供结果。 问题是,我不知道如何执行查询给我这样的结果:

city   fruit   good   bad
ny     bananna 3      2
ny     apple   1      3
ny     peach   3      2
boston banana  2      5
boston peach   2      1
...

我们的想法是,我们按照城市和水果这两个方面进行分组,但我想只获得每个城市内的水果数量。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

您正在转移数据。在这种情况下,我所知道的最简单的方法是

    {li} GROUP位于cityfruit列上
  • 使用CASE确定记录是好还是坏
  • SUM这些结果

SQL声明

SELECT city
       , fruit
       , SUM(CASE WHEN result = 'good' THEN 1 ELSE 0 END) AS good
       , SUM(CASE WHEN result = 'bad' THEN 1 ELSE 0 END) AS bad
FROM   Fruits
GROUP BY
       city
       , fruit

答案 1 :(得分:1)

这种技术通常被称为“枢轴”:

select
    city,
    fruit,
    sum(result = 'good') as good,
    sum(result = 'bad') as bad
from mytable
group by 1,2

请注意优雅使用sum(condition)而非普通sum(case...)

被修改

像往常一样,人们不禁发表批评/不相关的评论,所以要记录......

sum(condition)方法适用于将true视为1false视为0的任何数据库。 Mysql就是这样一个数据库,因此这是mysql标记问题的合适答案。里程可能因其他数据库而异。

答案 2 :(得分:1)

SELECT City, Fruit,
       SUM(CASE WHEN Result = 'good' THEN 1 ELSE 0 END) AS Good,
       SUM(CASE WHEN Result = 'good' THEN 0 ELSE 1 END) AS Bad
  FROM DataSet
 GROUP BY City, Fruit