开发者

Oracle 10g : Monthly stats with grouping by file size

I am on Oracle 10g. I have a table that contains all the files stored in the system during the past year. I want to make statistical monthly deposits, grouping them by file size. eg

0-1m
1m-10m
10m-100m
100m +

So my results would look like :

Month, 0-1m, 1m-10m, 10m-100m, 100mplus
2009-03, 999, 999, 999, 999

I want to use Oracle's ana开发者_高级运维lytic functions but they are not familiar to me.

Your help would be greatly appreciated.

update: I have this query which gives me a flat list.

select mois, groupement, count(*) nb
from 
  (
  select to_char(vercdate,'YYYY-MM') mois, 
          case 
            when datasize > 1024*1024*1024 then 'Go'
            when datasize > 1024*1024*100 then '100Mo'
            when datasize > 1024*1024*10 then '10Mo'
            when datasize > 1024*1024 then '1Mo'
            else '0Mo'
          end groupement
    from table
    where lower(filetype) = 'pdf'
  )
where groupement <> '0Mo'
GROUP by mois, groupement

which gives something like :

2007-08 1Mo 745
2007-08 10Mo    48
2007-09 1Mo 973
2007-09 10Mo    175
2007-09 100Mo   1
2007-10 1Mo 913
2007-10 10Mo    64
2007-11 1Mo 828
2007-11 10Mo    71
2007-12 1Mo 456
2007-12 10Mo    24
2007-12 100Mo   1
2008-01 1Mo 693

Now I have to make the analytical part.


I don't see the analytical part - it just looks like you need to pivot the data, like so:

WITH example AS (
     SELECT EXTRACT(YEAR FROM t.vercdate) 'y',
            EXTRACT(MONTH FROM t.vercdate) 'm',
            CASE
              WHEN t.datasize > 1024*1024*1024 THEN 'Go'
              WHEN t.datasize > 1024*1024*100 THEN '100Mo'
              WHEN t.datasize > 1024*1024*10 THEN '10Mo'
              WHEN t.datasize > 1024*1024 THEN '1Mo'
              ELSE '0Mo'
            END groupement
       FROM TABLE t
      WHERE LOWER(t.filetype) = 'pdf')
SELECT t.mois,
       CASE WHEN t.groupement = '1Mo' THEN t.nb ELSE NULL END '0-1m',
       CASE WHEN t.groupement = '10Mo' THEN t.nb ELSE NULL END '1m-10m',
       CASE WHEN t.groupement = '100Mo' THEN t.nb ELSE NULL END '10m-100m',
       ...etc...
  FROM (SELECT e.y || '-' || e.m mois, 
               groupement, 
               COUNT(e.*) 'nb'
          FROM example e
         WHERE e.groupement != '0Mo'
      GROUP BY e.y, e.m, e.groupement) t

Reference: EXTRACT


this is too much work to do if from scratch. those key words can help you Decode, Sum Over (Partition By).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜