带引用的Oracle查询

时间:2017-12-27 22:48:41

标签: sql oracle plsql aggregate

你能用纯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

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

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

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

2 个答案:

答案 0 :(得分: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

祝你好运。

答案 1 :(得分: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));