Oracle SQL从数据创建PDF

时间:2013-08-07 08:57:09

标签: sql oracle

所以我试图通过SQL查询从Oracle SQL表中的数据创建概率密度函数。请考虑下表:

Name  |  Spend
--------------
Anne  |  110
Phil  |  40
Sue   |  99
Jeff  |  190
Stan  |  80
Joe   |  90
Ben   |  100
Lee   |  85

现在,如果我想根据该数据创建PDF,我需要计算每个客户在特定量子(0到50之间或50到100之间)花费的次数。一个示例图表看起来像这样(原谅我糟糕的ascii艺术):

5|
4|  *
3|  * 
2|  * *
1|* * * *
 |_ _ _ _ 
  5 1 1 2 
  0 0 5 0 
    0 0 0

所以轴是:

  • X轴:是水桶
  • Y轴:是客户数量

我目前正在使用Oracle SQL CASE函数来确定支出是否属于存储桶,然后总结客户数量。然而,这是永远的,因为它有几个百万条记录

如何有效地做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以尝试使用WIDTH_BUCKET功能。

select bucket , count(name) 
  from (select name, spend,
               WIDTH_BUCKET(spend, 0, 200, 4) bucket
          from mytable
       )
group by bucket
order by bucket;

这里我将范围0到200划分为4个桶。并且该功能为每个值分配一个桶号。您可以按此存储桶进行分组,并计算每个存储桶中有多少个reocrds。

演示here

您甚至可以显示实际的铲斗范围。

select bucket,
       cast(min_value + ((bucket-1) * (max_value-min_value)/buckets) as varchar2(10))
       ||'-'
       ||cast(min_value + ((bucket) * (max_value-min_value)/buckets) as varchar2(10)),
       count(name) c 
  from (select name,
               spend,
               WIDTH_BUCKET(spend, min_value, max_value, buckets) bucket
          from mytable)
 group by bucket
 order by bucket;

示例here

答案 1 :(得分:0)

SELECT COUNT(*) y_axis,
     X_AXIS
FROM
     (SELECT COUNT(*)y_axis,
          CASE
               WHEN spend <= 50 THEN 50
               WHEN spend < 100 AND spend > 50 THEN 100 
               WHEN spend  < 150 AND spend >= 100 THEN 150
               WHEN spend  < 200 AND spend >= 150 THEN 200
          END x_axis
     FROM your_table
     GROUP BY spend
     )
GROUP BY X_AXIS;

    y_axis x_axis
-----------------
    4   100
    1   50
    1   200
    2   150