【问题标题】:Oracle SQL Create PDF from DataOracle SQL 从数据创建 PDF
【发布时间】:2013-08-08 13:40:11
【问题描述】:

所以我试图通过 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 函数来确定支出是否在存储桶内,然后将这样做的客户数量相加。然而,这需要很长时间,因为它有几百万条记录。

知道如何有效地做到这一点吗?

谢谢!

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以尝试使用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 个桶。该函数为每个值分配一个桶号。您可以按此存储桶分组并计算每个存储桶中有多少记录。

    演示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

    【讨论】:

    • 你先生是个传奇!非常感谢我正在寻找的东西。
    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      相关资源
      最近更新 更多