2017-07-26 2 views
0

ich einen Tisch vollen Konto habe Zahlen und Zeit/Bedingungen für Darlehen (Darlehenslaufzeit ist in Monaten)eine nummerierte Zeile bis zu einem bestimmten Wert mit einer anderen Spalte erreicht

Was ich tun muß, ist füllt eine nummerierte Reihe für jede Kontonummer, die kleiner oder gleich der Kreditlaufzeit ist. Ich habe einen Screenshot unten angehängt:

Example

So für dieses spezielle Beispiel werde ich 48 numerierten Reihen für diese Kontonummer müssen, wie der Begriff nur 48 Monate.

Danke für die Hilfe!

+0

Was Version Ihrer Datenbank? (Wie 12.1.0.2.0) Wenn Sie nicht sicher wissen, wählen Sie * aus v $ version. Verschiedene Antworten sind in verschiedenen Versionen der Datenbank verfügbar. – mathguy

+0

Bitte formatieren Sie Text [nicht Bilder] (https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so-when-asking-a-question/285557# 285557). –

+0

Oracle-Version: 11g Enterprise Edition Version 11.2.0.3. – DieHard345

Antwort

1
with 
    test_data (account_nmbr, term) as (
     select 'ABC200', 6 from dual union all 
     select 'DEF100', 8 from dual 
    ) 
-- End of simulated inputs (for testing purposes only, not part of the solution). 
-- SQL query begins BELOW THIS LINE. 
select  level as row_nmbr, term, account_nmbr 
from  test_data 
connect by level <= term 
     and prior account_nmbr = account_nmbr 
     and prior sys_guid() is not null 
order by account_nmbr, row_nmbr -- If needed 
; 

    ROW_NMBR  TERM ACCOUNT_NMBR 
    -------- ---------- ------------ 
     1   6 ABC200 
     2   6 ABC200 
     3   6 ABC200 
     4   6 ABC200 
     5   6 ABC200 
     6   6 ABC200 
     1   8 DEF100 
     2   8 DEF100 
     3   8 DEF100 
     4   8 DEF100 
     5   8 DEF100 
     6   8 DEF100 
     7   8 DEF100 
     8   8 DEF100 

In Oracle 12, können Sie die LATERAL Klausel für die gleiche verwenden:

with 
    test_data (account_nmbr, term) as (
     select 'ABC200', 6 from dual union all 
     select 'DEF100', 8 from dual 
    ) 
-- End of simulated inputs (for testing purposes only, not part of the solution). 
-- SQL query begins BELOW THIS LINE. 
select l.row_nmbr, t.term, t.account_nmbr 
from  test_data t, 
     lateral (select level as row_nmbr from dual connect by level <= term) l 
order by account_nmbr, row_nmbr -- If needed 
; 
+0

Die zweite Abfrage funktionierte perfekt in 11g. Vielen Dank dafür! – DieHard345

+0

@ DieHard345 - meinst du die ** erste ** Abfrage in 11g gearbeitet? Wenn die zweite Abfrage tatsächlich funktioniert, wäre das sehr überraschend, da "LATERAL" nur in Oracle 12.1 eingeführt (oder zumindest dokumentiert) wurde. – mathguy

+0

Die Querabfrage funktionierte in der 11g-Datenbank, von der ich diese ausführe. Ich habe sogar ausgewählt * von v $ Version, um die Version zu bestätigen. Danke nochmal für die Hilfe. – DieHard345

Verwandte Themen