您好我正在使用Oracle SQL Developer,并试图在我的桌子上获得百分比。
我当前的查询是:
select
decode(grouping(life), 1, 'Total', life) as "LifeName",
sum(case
when task is not null and to_char(datee, 'MM') = '08'
and to_char(datee, 'YYYY') = '2013'
then 1
else 0
end) as "MonthStatus"
from life_lk, task_c
where life_lk.life_id = task_c.life_id
group by rollup(life)
我得到的当前输出是:
LifeName MonthStatus
dog 5
bear 20
cat 1
Fish 4
Total 30
但是,我希望输出为:
LifeName MonthStatus Percent
dog 5 16
bear 20 66
cat 1 3
Fish 4 13
Total 30 100
因此,对于Month Status下的每个单元格,我希望将数字除以Total,在这种情况下为30.该数字将随时间动态变化,因此我不能简单地除以30。
抱歉看起来很草率。我不知道如何让它们整洁整齐。
感谢您的帮助
答案 0 :(得分:2)
分析函数ratio_to_report()可能适合您。它给出了一个值与指定窗口的所有值之和的比率。
在你的情况下:
100* ratio_to_report(sum(...)) over ()
我不确定在汇总的情况下它是如何工作的。
http://docs.oracle.com/cd/E18283_01/server.112/e17118/functions142.htm
答案 1 :(得分:1)
有两种简单的方法可以获得正确的结果,因为ROLLUP只是添加了一个总计,导致每行加总两次:
将PARTITION BY GROUPING(生命)添加到ratio_to_report
或简单地将结果乘以200而不是100:200 * ratio_to_report(...)
答案 2 :(得分:1)
SELECT t1.lifename, t1.monthstatus, (t1.monthstatus / t2.total * 100) as prcent FROM
(
select
decode(grouping(life), 1, 'Total', life) as "LifeName",
sum(case
when task is not null and to_char(datee, 'MM') = '08'
and to_char(datee, 'YYYY') = '2013'
then 1
else 0
end) as "MonthStatus"
from life_lk, task_c
where life_lk.life_id = task_c.life_id
group by rollup(life) ) t1
,
(select sum(monthstatus) as total FROM life_lk) t2 ;
这应该可行,但我可能错了你的表和列
答案 3 :(得分:0)
我想你可以除以
SELECT COUNT (MonthStatus)
获得你的百分比。