3

こんにちは、私は 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 の下の各セルについて、この場合は 30 である Total で数値を除算したいと考えています。数値は時間の経過とともに動的に変化するため、単純に 30 で除算することはできません。

見栄えの悪いテーブルで申し訳ありません。それらをきれいに並べて見せる方法がわかりません。

助けてくれてありがとう

4

4 に答える 4

1

ROLLUP は総計を追加するだけで、すべての行が 2 回合計されるため、適切な結果を得る簡単な方法が 2 つあります。

ratio_to_report に PARTITION BY GROUPING(life) を追加します

または、単純に結果に 100 ではなく 200 を掛けます: 200*ratio_to_report(...)

于 2013-08-28T22:49:01.770 に答える
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 ;

これは機能するはずですが、テーブルと列が間違っている可能性があります

于 2013-08-28T23:43:36.470 に答える
0

で割ってもいいと思います

SELECT COUNT (MonthStatus)    

あなたのポーセンテージを取得します。

于 2013-08-28T20:19:58.077 に答える