Oracle SQL正在尝试获取列的百分比

Oracle SQL正在尝试获取列的百分比,sql,oracle,Sql,Oracle,您好,我使用的是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' th

您好,我使用的是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
所以对于每月状态下的每个单元格,我希望数字除以总数,在本例中为30。这个数字会随时间动态变化,所以我不能简单地除以30

对不起,桌子看起来很邋遢。我不知道如何让它们看起来整洁整齐


谢谢你的帮助我想你可以除以

SELECT COUNT (MonthStatus)    

获取您的瓷器。

分析函数比率报告()可能适合您。它给出指定窗口的值与所有这些值之和的比率

就你而言:

100* ratio_to_report(sum(...)) over ()
不过,我不确定在存在汇总的情况下它会如何工作


有两种简单的方法可以得到正确的结果,因为汇总只是简单地添加一个总计,结果是每行求和两次:

将分区按分组(寿命)添加到比率报告中

或者简单地将结果乘以200,而不是100:200*比率报告(…)


这应该行得通,但如果我尝试将MonthStatus除以count(*),则可能是您的表和列搞错了。每行只输出1,我猜它返回的值介于0和1之间。试着把结果乘以100。好吧,我想把monthstatus下的每一行除以30。因此,狗排在百分比以下基本上是5/30。唯一的问题是数字30会动态变化。你不总是通过计数(MonthStatus)得到新值吗?那么百分比将是(动物/计数(MonthStatus))*100您的担心是有根据的;小计会弄乱百分比。在本例中,“总计”行的值分别为50%和8.33%、33.33%、1.67%和6.67%。如果只有一个总计行,那么在这种情况下,我会乘以2,因为没有更好的思考但更复杂的解决方案——例如内联视图、分组窗口(life)没问题,很高兴我能提供帮助!
 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 ;