【问题标题】:Oracle SQL when querying a range of data查询一系列数据时的 Oracle SQL
【发布时间】:2017-01-11 02:03:01
【问题描述】:

我有一个表,它的 ID 将包含多个存储桶字段中的数据。我想要一个函数来拉出一个桶的总和,但是函数参数将包括开始和结束桶字段。

所以,如果我有这样一张桌子:

ID   Bucket0  Bucket30  Bucket60  Bucket90  Bucket120
10       5.00    12.00     10.00       0.0       8.00

如果我发送 ID 和参数 Bucket0、Bucket0,它将只返回 Bucket0 字段中的值:5.00

如果我发送 ID 和参数 Bucket30、Bucket120,它将返回从 30 到 120 或 (12+10+0+8) 30.00 的桶的总和。

除了一个巨大的丑陋之外,还有更好的方法来写这个

if parameter1=bucket0 and parameter2=bucket0 
    then select bucket0
else if parameter1=bucket0 and parameter2=bucket1 
    then select bucket0 + bucket1
else if parameter1=bucket0 and parameter2=bucket2 
    then select bucket0 + bucket1 + bucket2

等等?

该表已经存在,因此我对此没有太多控制权。我可以根据需要为函数设置参数。我可以肯定地说,如果需要一组存储桶,中间的任何存储桶都不会被跳过,因此指定开始存储桶和结束存储桶就可以了。我可以有一个逗号分隔的字符串,包含所有想要的存储桶。

【问题讨论】:

  • 当您的数据库设计需要时,寻找好的方法不会很有成效。您的存储桶列不应该是单独的列。相反,您应该有两列:bucketbucket_id,并有更多行。
  • @trincot 也许是这样,但正如我所说,我无法控制。

标签: function plsql oracle11g


【解决方案1】:

如果你的表被标准化会更好,像这样:

id | bucket    | value
---+-----------+------
10 | bucket000 |  5
10 | bucket030 | 12
10 | bucket060 | 10
10 | bucket090 |  0
10 | bucket120 |  8

此外,存储桶最好具有易于在范围内比较的名称,以便 bucket030 按正常字母顺序位于 bucket000bucket120 之间,如果省略填充则不是这种情况零。

如果无法进行上述规范化,则使用unpivot 子句将当前表转换为上述结构:

select id, sum(value)
from (
        select *
        from mytable 
        unpivot (value for bucket_id in (bucket0   as 'bucket000', 
                                         bucket30  as 'bucket030', 
                                         bucket60  as 'bucket060',
                                         bucket90  as 'bucket090',
                                         bucket120 as 'bucket120'))
     ) normalised
where bucket_id between 'bucket000' and 'bucket060'
group by id

当您对参数变量执行此操作时,请确保这些参数也有填充的零。

例如,您可以确保 parameter1 如下所示:

if parameter1 like 'bucket%' then
    parameter1 := 'bucket' || lpad(+substr(parameter1, 7), 3, '0');
end if;

...等等。

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多