2017-12-27 14 views
0

Können Sie dies in Plain SQL tun? Ich muss so etwas tun:Oracle-Abfrage mit Referenzen

initial_value = 10000 
start_value = 10000 

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

Also, im Grunde bin ich aggregieren, wie die Abfrage ausgeführt wird. Aber wenn ich mich auf vorherige Werte in der Abfrage beziehe, glaube ich nicht, dass dies möglich ist. Am Ende muss dies ein Datensatz sein, den ich einen Cursor öffnen und die Anwendung lesen lassen kann.

In der Hoffnung, keinen Objekttyp zu erstellen oder temporäre Tabellen zu verwenden. Es scheint eine Art einfache Operation zu sein, Abfragen und einige Aggregate auszuführen, aber ich denke, dass es die laufenden Zahlen hält, was ein Problem ist.

Alle Gedanken oder Vorschläge wären großartig.

+1

Bitte ** [EDIT] ** Ihre Frage ein und fügen Sie einige [Beispieldaten] (http://plaintexttools.github.io/plain-text-table/) und die erwartete Ausgabe auf der Grundlage dieser Daten. [** Formatierter Text **] (http://stackoverflow.com/help/formatting) bitte, [** keine Screenshots **] (http://meta.stackoverflow.com/questions/285551/why-may -I-nicht-Upload-Bilder-of-Code-auf-so-wenn-eine Frage zu stellen/285557 # 285557). –

+0

Warum denken Sie, dass es ein Problem geben wird? Stellen Sie einfach Ihre Frage und spekulieren Sie nicht darüber, was getan werden kann und was nicht - Sie sind sehr wahrscheinlich im Irrtum. Abhängig von der genauen Anforderung (die noch nicht klar ist), benötigen Sie möglicherweise analytische Funktionen. Diese gibt es seit vielen Jahren in Oracle, die Leute benutzen sie die ganze Zeit. Ihr Fokus sollte darauf liegen, das Problem so klar wie möglich zu beschreiben und neben einer klaren Problemstellung aussagekräftige Testdaten und gewünschte Ergebnisse zu liefern. – mathguy

Antwort

1

Mit einer Tabelle definiert und bevölkert als

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); 

Wir haben die LAG analytische Funktion können Sie bekommen, was Sie wollen. Es kann kompaktere Möglichkeiten, dies zu tun, aber die folgenden sollte als Demonstration dienen:

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

Best of luck.

+0

Diese Abfrage ist interessant. Ich muss damit arbeiten. Es gibt jedoch 2 andere Informationen, die ich von der Abfrage benötige, die ich vergessen habe zu erwähnen. Das erste ist das Datum von der SOME_TABLE. (Sagen Sie date_received). Ich brauche auch eine Kennung, die in SOME_TABLE (Sagen Sie Ticker) ist. Kann diese Abfrage diese Werte auch im CROSS JOIN-Teil zurückgeben? –

0

Vielleicht können Sie eine Funktion verwenden, die PIPELINED-Zeilen zurückgibt. Siehe unten.

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));