2016-03-20 36 views
0

ich bin neu in Oracle SQL und ich brauche, wie unten mit einer Aufgabe zu beschäftigen ..

Oracle SQL listagg auf einer anderen Spalte basiert

I atttached haben ein Bild hier und was ich gerade jetzt tun needa, mit SQL das Ergebnis zu zeigen, wie rechts von der linken Seite ..

ich brauche die Spalte 2 (C2) und Spalte 3 (C3) listagg, bezogen auf Spalte 1 (C1)
Wenn C2 und C3 habe gerade einen Datensatz und keine doppelten Datensätze,
dann zeigt das Ergebnis wie die erste Zeile: 4316, Orange Shipper 1, Hong Kong, China.
Allerdings gibt es einige knifflige Fälle wie 4343/4403/4406 in C1.

C2 kann Datensätze dupliziert haben, aber C3 nicht, umgekehrt.

Ich habe versucht, rank_over zu verwenden, dann wird das Ergebnis die linke Seite im angehängten Bild.

SELECT t1.number AS C1, 
     t2.shipper AS C2, 
     rank() over (partition BY t2.shipper 
        ORDER BY t1.number) AS rank_over_c2, 
     t2.venue AS C3, 
     rank() over (partition BY t2.venue 
        ORDER BY t1.number) AS rank_over_c3 
FROM table1 t1, 
    table2 t2 

Aber danach habe ich keine Ahnung, wie ich das Ergebnis wie der rechten Seite in dem beigefügten Bild bekommen ..

Image ist hier:
Linke Seite die ursprünglichen Spalten und Daten vorhanden sind, ich möchte das Ergebnis wie die rechte Seite

+0

Ihre Frage unstrukturierten zu sein scheint. Unter http://stackoverflow.com/help/how-to-ask finden Sie Antworten auf Fragen, die einfach beantwortet werden können. – F43nd1r

Antwort

0

Versuchen zu bekommen:

SELECT * FROM 
(
    SELECT c1, listagg(c2, ', ') within group (order by c2) as C2 
    FROM (select distinct c1, c2 from c1c2) 
    Group by c1 
) x 
JOIN (
    SELECT c1, listagg(c3, ', ') within group (order by c3) as C3 
    FROM (select distinct c1, c3 from c1c2) 
    Group by c1 
) y 
using(c1) 
Verwandte Themen