sql中case和group by一起用的一个问题

下面我们来看一下,使用Case函数都能做些什么事情。一,已知数据按照另外一种方式进行分组,分析。有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为P... 下面我们来看一下,使用Case函数都能做些什么事情。

一,已知数据按照另外一种方式进行分组,分析。

有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为PrimaryKey)
国家(country)人口(population)
中国600
美国100
加拿大100
英国200
法国300
日本250
德国200
墨西哥50
印度250

根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
洲人口
亚洲1100
北美洲250
其他700

想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。
如果使用Case函数,SQL代码如下:
SELECT SUM(population),
CASE country
WHEN'中国' THEN'亚洲'
WHEN'印度' THEN'亚洲'
WHEN'日本' THEN'亚洲'
WHEN'美国' THEN'北美洲'
WHEN'加拿大' THEN'北美洲'
WHEN'墨西哥' THEN'北美洲'
ELSE'其他'END
FROM Table_A
GROUP BY CASE country
WHEN'中国' THEN'亚洲'
WHEN'印度' THEN'亚洲'
WHEN'日本' THEN'亚洲'
WHEN'美国' THEN'北美洲'
WHEN'加拿大' THEN'北美洲'
WHEN'墨西哥' THEN'北美洲'
ELSE'其他'END;

请问上面的例子里面,group by 可以和case这样用吗?group by 后面应该跟列名不是吗?上面看上去好像不是这样的。不知道对不对。求人来回答
展开
 我来答
blademaster717
推荐于2017-09-12 · TA获得超过1457个赞
知道小有建树答主
回答量:882
采纳率:97%
帮助的人:372万
展开全部

可以的,group by后边整个条件 就是列:

CASE country

               WHEN'中国'     THEN'亚洲'

               WHEN'印度'     THEN'亚洲'

               WHEN'日本'     THEN'亚洲'

               WHEN'美国'     THEN'北美洲'

               WHEN'加拿大'  THEN'北美洲'

               WHEN'墨西哥'  THEN'北美洲'

       ELSE'其他'END

追问
group 和聚合函数一起用的时候,group by 后面一定要列出所有被select的列。然后他这边case 后面的都是一个列?你能说更详细一些吗
追答
可以说他就是对应where前那个case的

要不然去掉的话,他分组就是根据原来的列值来分组,也就是'中国','印度'……
那就没有意义了。
twvampire
2013-10-16 · TA获得超过3620个赞
知道大有可为答主
回答量:3029
采纳率:76%
帮助的人:3010万
展开全部

没见过这个写法,,,

我一般是这样写,,,

SELECT tt,SUM(population)
FROM 
(
SELECT  SUM(population) AS population,
        (CASE 
                WHEN country='中国'     THEN'亚洲'  
                WHEN country='印度'     THEN'亚洲'
                WHEN country='日本'     THEN'亚洲'
                WHEN country='美国'     THEN'北美洲'
                WHEN country='加拿大'  THEN'北美洲'
                WHEN country='墨西哥'  THEN'北美洲'
        ELSE'其他'END) tt
FROM    test
GROUP BY  country
) a
GROUP BY tt

 你的这种写法,,是

SELECT  SUM(population) AS population,
        (CASE 
                WHEN country='中国'     THEN'亚洲'  
                WHEN country='印度'     THEN'亚洲'
                WHEN country='日本'     THEN'亚洲'
                WHEN country='美国'     THEN'北美洲'
                WHEN country='加拿大'  THEN'北美洲'
                WHEN country='墨西哥'  THEN'北美洲'
        ELSE'其他'END) tt
FROM    test
GROUP BY  CASE 
                WHEN country='中国'     THEN'亚洲'  
                WHEN country='印度'     THEN'亚洲'
                WHEN country='日本'     THEN'亚洲'
                WHEN country='美国'     THEN'北美洲'
                WHEN country='加拿大'  THEN'北美洲'
                WHEN country='墨西哥'  THEN'北美洲'
        ELSE'其他'END
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小狂中E
2013-10-16 · TA获得超过1418个赞
知道大有可为答主
回答量:1514
采纳率:66%
帮助的人:1034万
展开全部

如果是sqlserver/db2/oracle,更清晰的写法:

with b as (select case when country in ('中国','印度','日本') then '亚洲' when country in ('美国','加拿大','墨西哥') then '北美洲' else '其他' end) s, population)
select s, sum(population)
from b
group by s

如果是access/mysql等,则把b后的子查询搬到b前面

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式