假设我有这个数据集:
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 ...
我们的想法是,我们按照城市和水果这两个方面进行分组,但我想只获得每个城市内的水果数量。我怎么能这样做?
答案 0 :(得分:2)
您正在转移数据。在这种情况下,我所知道的最简单的方法是
GROUP
位于city
和fruit
列上
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
视为1
而false
视为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