【问题标题】:Oracle 10g : Monthly stats with grouping by file sizeOracle 10g:按文件大小分组的月度统计数据
【发布时间】:2009-10-15 19:28:40
【问题描述】:

我使用的是 Oracle 10g。 我有一张表,其中包含过去一年存储在系统中的所有文件。 我想统计每月存款,按文件大小分组。例如

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

所以我的结果看起来像:

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

我想使用 Oracle 的分析功能,但我不熟悉。

非常感谢您的帮助。

更新: 我有这个查询,它给了我一个平面列表。

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

这给出了类似的东西:

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

现在我必须进行分析。

【问题讨论】:

    标签: sql oracle plsql oracle10g


    【解决方案1】:

    我没有看到分析部分 - 看起来您需要对数据进行透视,如下所示:

    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
    

    参考:EXTRACT

    【讨论】:

    • 谢谢你,我以前从未见过“WITH blah AS”或 EXTRACT 函数。
    • WITH 语法在 Oracle 中称为子查询分解,在 Oracle 9i+ 中受支持。
    【解决方案2】:

    如果从头开始,工作量太大。这些关键词可以帮你解码、求和(Partition By)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多