首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL -分组依据后计算百分比-仅显示一行

SQL -分组依据后计算百分比-仅显示一行
EN

Stack Overflow用户
提问于 2018-08-15 05:02:24
回答 1查看 553关注 0票数 1

我在SQL上摆弄group by子句,并根据临时表"A“的结果找出百分比。

这就是小提琴。

http://sqlfiddle.com/#!9/faf2f/6959

我确实遇到过不同的实现方法,比如使用union all,但我的问题是,为什么这个查询只返回一行,而不是两行。

  • 列表项

数据:

代码语言:javascript
复制
TotalCost
230
200
100
1254

查询:

代码语言:javascript
复制
SELECT Category, Cnt , Cnt/sum(Cnt)  as percent from (

SELECT 
  Case When TotalCost < 301 Then '0-300'
  Else ' > 300' End as Category,
  count(*) as cnt
  FROM Cars      
  group by Category       

  ) A
;

预期结果:

代码语言:javascript
复制
Category    Cnt   percent
0-300        3     75
> 300        1     25

实际结果:

代码语言:javascript
复制
Category    Cnt  percent
> 300        1    25
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-15 05:09:18

  1. 您可以尝试按case when而不是别名进行分组。
  2. seconde您的总计数需要执行所有计数才能执行子查询。

看起来像这样。

代码语言:javascript
复制
SELECT Category, Cnt , Cnt/(select count(*) from Cars) * 100  as percent 
from (
  SELECT 
  (Case When TotalCost < 301 Then '0-300'
  Else ' > 300' End) as Category,
  count(*) as cnt
  FROM Cars
  GROUP BY  (Case When TotalCost < 301 Then '0-300'
  Else ' > 300' End)
) A
ORDER BY 3 DESC

或者,您可以使用CROSS JOIN来获取总数。

代码语言:javascript
复制
SELECT Category, Cnt , Cnt/v.totle * 100  as percent 
from (
  SELECT 
  (Case When TotalCost < 301 Then '0-300'
  Else ' > 300' End) as Category,
  count(*) as cnt
  FROM Cars
  GROUP BY  (Case When TotalCost < 301 Then '0-300'
  Else ' > 300' End)
) A CROSS JOIN (select count(*) totle from Cars) v

sqlfiddle

结果

代码语言:javascript
复制
| Category | Cnt | percent |
|----------|-----|---------|
|    0-300 |   3 |      75 |
|    > 300 |   1 |      25 |
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51849718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档