请教一个计算百分比的问题

row32hahaha 2012-06-21 04:35:35
数据如下:

类别 品名 数量
A 鸭脖 25.5
A 鸡爪 82
B 脉动 26
A 香肠 12
B 加多宝 22


需求是我要得到A类中每个品名占自己类别数量的百分比SQL该如何写?

想查询得到
品名 数量 比例
鸭脖 25.5 21.34%
鸡爪 82 68.62%
香肠 12 10.04%
脉动 26 54.17%
加多宝 22 45.83%

...全文
126 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
sql写成这样了 如果非要小类大类统计 考虑分开统计了union all合并吧


with t1 as
(
select 'C' c1,'A' c2,'鸭脖' c3,25.5 c4 from dual
union all
select 'C' c1,'A' c2,'鸡爪' c3,82 c4 from dual
union all
select 'C' c1,'B' c2,'脉动' c3,26 c4 from dual
union all
select 'C' c1,'A' c2,'香肠' c3,12 c4 from dual
union all
select 'C' c1,'B' c2,'加多宝' c3,22 c4 from dual
union all
select 'D' c1,'E' c2,'牙刷' c3,36 c4 from dual
union all
select 'D' c1,'E' c2,'毛巾' c3,22 c4 from dual
)

select c1,c2,c3,c4,
round(c4/sum(c4) over(partition by c1,c2),4)*100||'%' c5,
round(c4/sum(c4) over(partition by c1),4)*100||'%' c6
from t1


c1 c2 c3 c4 c5 c6
-----------------------------------------------------------
1 C A 鸭脖 25.5 21.34% 15.22%
2 C A 鸡爪 82 68.62% 48.96%
3 C A 香肠 12 10.04% 7.16%
4 C B 加多宝 22 45.83% 13.13%
5 C B 脉动 26 54.17% 15.52%
6 D E 毛巾 22 37.93% 37.93%
7 D E 牙刷 36 62.07% 62.07%

row32hahaha 2012-06-21
  • 打赏
  • 举报
回复
求解啊,被这个BT报表折腾疯了
row32hahaha 2012-06-21
  • 打赏
  • 举报
回复
大类别 类别 品名 数量
C A 鸭脖 25.5
C A 鸡爪 82
C B 脉动 26
C A 香肠 12
C B 加多宝 22
D E 牙刷 36
D E 毛巾 22

纠正下需求描述
这是表。现在要得到以下数据的查询。。。

品名 数量 小类占比 大类占比
鸭脖 25.5 21.34% 15.22%
鸡爪 82 68.62% 48.96%
香肠 12 10.04% 7.16%
A类 119.5
脉动 26 54.17% 15.52%
加多宝22 45.83% 13.13%
B类 48
C类 167.5
牙刷 36 62.07% 62.07%
毛巾 22 37.93% 37.93%
E类 58

  • 打赏
  • 举报
回复
没有就构造吧 不行的话 查询条件写死吧 也不知道具体什么数据 不行的话 只能说表设计有问题了
row32hahaha 2012-06-21
  • 打赏
  • 举报
回复
是定死的,而且还有层级关系却没有类别外键表。比如 香肠、鸡爪、鸭脖属于A类,脉动、加多宝属于B类
但这5样一共属于C类。这怎么弄?就算我在里层子查询里添加了类别,但不在一列上啊。因为有层级关系
  • 打赏
  • 举报
回复
没类别 如何确定哪几个是一类?
row32hahaha 2012-06-21
  • 打赏
  • 举报
回复
没类别分组的情况下如何处理达到同样的效果呢?
row32hahaha 2012-06-21
  • 打赏
  • 举报
回复
好像我这个例子不太合适,实际情况比这个复杂。首先没有类别。也就是设计数据库的人没给类别出来
只能写死是某几样汇总。然后,数据源也是N个表用很复杂的逻辑计算得到。脑子都快炸了
  • 打赏
  • 举报
回复
使用子查询 结果也是一样


select c1,c2,c3,round(c3/(select sum(c3) from t1 a where a.c1 = t1.c1),4)*100||'%' c4
from t1
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

果然还是要用over() 对oracle的over()实在不会用。
[/Quote]

可以试着多研究下 不熟悉 也可以使用子查询代替呀
row32hahaha 2012-06-21
  • 打赏
  • 举报
回复
果然还是要用over() 对oracle的over()实在不会用。
  • 打赏
  • 举报
回复
这样吧?


with t1 as
(
select 'A' c1,'鸭脖' c2,25.5 c3 from dual
union all
select 'A' c1,'鸡爪' c2,82 c3 from dual
union all
select 'B' c1,'脉动' c2,26 c3 from dual
union all
select 'A' c1,'香肠' c2,12 c3 from dual
union all
select 'B' c1,'加多宝' c2,22 c3 from dual
)

select c1,c2,c3,round(c3/sum(c3) over(partition by c1),4)*100||'%' c4
from t1



c1 c2 c3 c4
-----------------------------------------------
1 A 香肠 12 10.04%
2 A 鸡爪 82 68.62%
3 A 鸭脖 25.5 21.34%
4 B 加多宝 22 45.83%
5 B 脉动 26 54.17%

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧