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 后面应该跟列名不是吗?上面看上去好像不是这样的。不知道对不对。求人来回答 展开
一,已知数据按照另外一种方式进行分组,分析。
有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为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 后面应该跟列名不是吗?上面看上去好像不是这样的。不知道对不对。求人来回答 展开
展开全部
可以的,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的
要不然去掉的话,他分组就是根据原来的列值来分组,也就是'中国','印度'……
那就没有意义了。
展开全部
没见过这个写法,,,
我一般是这样写,,,
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果是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前面
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询