2016-04-20 8 views
0

Ich habe zwei TabellenAbfrage zwei Tabellen zu verknüpfen und LISTAGG Funktion

 
price 
-------- 

id  value key 
sku1 r1  12 
sku1 r2  13 
sku2 r1  12 
sku3 r1  14 

specialprice 
----- 

id  value key startdate enddate 
sku2 r2  13 20-Mar  20-May 
sku3 r1  15 20-Mar  20-May 

Ich versuche LISTAGG Funktion zu nutzen und bringt eine Ausgabe wie zu verwenden:

 
output 
------ 
skuid value 
sku1 r1:12,r2:13 
sku2 r2:13 
sku3 r1:15 

Wenn ein Eintrag in specialprice ist Tabelle und sysdate ist zwischen Startdatum und Enddatum dann muss ich berücksichtigen, dass sonst ich Wert von der Preistabelle erhalten muss. In der Preistabelle kann eine ID zwei Einträge haben, die ich diese zwei Datensätze LISTAGG muss. Sonderpreis Tabelle möglicherweise keinen Eintrag für die ID in der Preistabelle. Also bin ich mit FULL OUTER

PFB Abfrage JOIN, die ich aufgebaut:

SELECT 
    a.id, 
    listagg (a.value | | ':' | | nvl (a.key, ' '), ',') WITHIN GROUP (ORDER BY a.value) AS price 
FROM price a 
FULL OUTER JOIN specialprice b 
    ON(b.id = a.id) 
WHERE sysdate between b.startdate and b.enddate 
GROUP BY a.id 

aber Problem ist, ich bin nicht in der Lage, den specialprice Tabellenwert und Schlüssel verbunden zu bekommen. Bitte helfen.

Antwort

0

Basierend auf der erläuterten Anforderung muss, wenn eine übereinstimmende ID in b vorhanden ist, dieser aktuelle Datensatz sein. Wenn kein übereinstimmender Datensatz gefunden wird, müssen noch Daten von a verwendet werden. Ein LEFT OUTER JOIN sollte ausreichen. Hoffe das hilft.

1

Versuchen Sie folgendes:

select id, listagg(value) within group(order by value) as price 
from (
select 
    p.id, 
    case when sp.id is not null and sysdate between sp.startdate and sp.enddate 
    then p.value||':'||p.key 
    else p.value||':'||p.key 
    end as value 
from price p 
left outer join specialprice sp 
    on p.id = sp.id 
) 
group by id; 
Verwandte Themen