带引用的Oracle查询

问题描述 投票:0回答:2

你能用纯SQL做到这一点吗?我需要做这样的事情:

initial_value = 10000
start_value = 10000

LOOP
  start_value = start_value * (1 + (['table column'] / 100));
  percent = ((start_value - initial_value) / initial_value) * 100;
END

所以,基本上我在查询运行时进行聚合。但是参考查询中的先前值,我不认为这是可能的。最后,这需要是一个记录集,我可以打开游标并读取应用程序。

希望不必创建对象类型,或使用临时表。它似乎是一种简单的操作,查询和运行一些聚合,但我认为这是保持运行数字这是一个问题。

任何想法或建议都会很棒。

sql oracle plsql aggregate
2个回答
1
投票

将表定义并填充为

create table some_table (table_column  number);

insert into some_table (table_column) values (1000);
insert into some_table (table_column) values (2000);
insert into some_table (table_column) values (3000);
insert into some_table (table_column) values (4000);
insert into some_table (table_column) values (5000);
insert into some_table (table_column) values (6000);
insert into some_table (table_column) values (7000);
insert into some_table (table_column) values (8000);
insert into some_table (table_column) values (9000);
insert into some_table (table_column) values (10000);

我们可以使用LAG分析函数来获得你想要的东西。可能有更紧凑的方法来完成此任务,但以下内容应作为演示:

WITH cteValues AS (SELECT 10000 AS START_VALUE,
                          10000 AS INITIAL_VALUE
                     FROM DUAL)
SELECT 1 + (TABLE_COLUMN / 100) +
         LAG(START_VALUE + 1 + (TABLE_COLUMN / 100), 1, INITIAL_VALUE)
           OVER (ORDER BY TABLE_COLUMN) AS RUNNING_VALUE,
       ((1 + (TABLE_COLUMN / 100) +
           LAG(START_VALUE + 1 + (TABLE_COLUMN / 100), 1, INITIAL_VALUE)
             OVER (ORDER BY TABLE_COLUMN)) - INITIAL_VALUE) / INITIAL_VALUE AS PERCENT_VALUE
  FROM cteValues c
  CROSS JOIN SOME_TABLE s;

SQLFiddle here

祝你好运。


0
投票

也许你可以使用一个返回PIPELINED行的函数。见下面的样本。

CREATE TYPE num_table IS TABLE OF NUMBER;
/

--here you can apply your program logic
CREATE FUNCTION get_nums(start_num NUMBER, end_num NUMBER) RETURN num_table PIPELINED
IS
BEGIN
    FOR num_loop IN start_num..end_num
    LOOP
        PIPE ROW(num_loop);
    END LOOP;
END;
/

SELECT *
  FROM table(get_nums(100, 200));
© www.soinside.com 2019 - 2024. All rights reserved.