[Oracle] Doppelte Einträge in extra Spalte

Dr_Doom

Mitglied
Hallo, ich habe folgende Aufgabenstellung

eine Abfrage liefert mir folgendes Ergebnis:

ID | str_key | hsnr | gis_id
------------------------------------
1 | XX23 | 3 | 25
2 | ZZ45 | 1 | 13
2 | ZZ45 | 1 | 15

es existieren also verschiedene gis_id´s zu ein und der gleichen id/str_key/hsnr kombination

ich möchte nun gern eine zeile sparen und die weiteren gis_ids in eine neue spalte zu packen also so hier

ID | str_key | hsnr | gis_id1 | gis_id2
------------------------------------
1 | XX23 | 3 | 25
2 | ZZ45 | 1 | 13 | 15

Mein Kollege meint, das wäre mit pl/sql und cursor möglich, kann mir jemand einen denkanstoß geben, habe damit bisher keine erfahrung
 
hallo, danke für die antwort, aber ich verstehe noch nicht so recht, wie mich das zum ziel bringt
hier ist meine abfrage über 2 tabellen, die das unten stehende ergebnis liefert, die fett markierte zeile ist das interessante, ich würde eben gerne diesen zweiten c01 wert eine zeile hochrutschen, am besten in eine neue spalte

Code:
select t.id,e.c13,t.hsnr,e.c12,t.datei,e.c01 
from e0102 e, temp_ha t
where e.c07 like '%-HA%' 
and rpad(t.str_key,5,'0')=e.c13 
and t.hsnr=e.c12 
and e.c02='KANAL'
order by t.datei

ID STR_KEY C13 HSNR C12 DATEI C01
300004 A0290 113* 113* 300004.tif 2824686
300006 H1470 99 99 300006.tif 2701290
300006 H1470 99 99 300006.tif 2701291
300008 E0510 23 23 300008.tif 2806341
300009 S3070 1 1 300009.tif 90118831
300010 W1010 116 116 300010.tif 2817727
300011 S0460 32 32 300011.tif 2816690
300012 W1010 130 130 300012.tif 2700364
300013 W1010 116 116 300013.tif 2817727
300014 W1010 118 118 300014.tif 2700355
 
habs bis jetzt mit Cursorn probiert, aber irgendwie noch nicht geschafft, den einen cursor bzw. dessen ausgabe vom anderen abhängig zu machen :-(

Vielleicht kann doch jemand helfen?

DECLARE

CURSOR distinctTabelle IS SELECT distinct id FROM temp_ha_alle order by id;
cursor ha_c01 is select * from temp_ha_alle order by id;

gis_kombi varchar(20);

BEGIN
FOR x
IN distinctTabelle
LOOP
for y
in ha_c01
loop
gis_kombi:=y.c01;
gis_kombi := concat(gis_kombi, y.c01);
end loop;
DBMS_OUTPUT.PUT_LINE (x.id||','||gis_kombi);
END LOOP;
END;
/ich bekomme alle distinct ids, aber immer nur eine gis id (bzw, 2 mal die gleich zusammen "concatet")

300004,38057833805783
300006,38057833805783
300008,38057833805783
300009,38057833805783
300010,38057833805783
....................................
 
Nicht besonders schoen, aber geht... ;-)

SQL:
DECLARE
  tab CONSTANT CHAR(1) := CHR(9);
  old_key VARCHAR2(500) := '';
  col_cnt NUMBER;
BEGIN
  -- wieviele Spalten am Ende der Tabelle?
  SELECT MAX(COUNT(*))
  INTO col_cnt
  FROM data_table
  GROUP BY id, str_key, hsnr;

  -- Tabellenkopf
  dbms_output.put('ID' || tab || 'STR_KEY' || tab || 'HSNR' || tab || 'DATEI');
  FOR i IN 1..col_cnt
  LOOP
    dbms_output.put(tab || 'c' || LPAD(i, 2, 0));
  END LOOP;

  -- Ergebnis
  FOR r IN 
  (
    SELECT *
    FROM data_table
  )
  LOOP
    IF old_key = r.id || r.str_key || r.hsnr
    THEN
      -- wenn Zeile mit vorherigem Schluessel, nur Spalte anfuegen
      dbms_output.put(tab || r.c01);
    ELSE
      -- sonst Zeile beenden und aktuelle Schluesselkombination "merken"
      dbms_output.put_line('');
      old_key := r.id || r.str_key || r.hsnr;
      dbms_output.put(r.id || tab || r.str_key || tab || r.hsnr || tab || r.datei || tab || r.c01);
    END IF;
  END LOOP;
  dbms_output.put_line('');
END;
/
 
Vielen Dank, funktioniert sehr gut, zwischenzeitlich hab ich den Datensatz aus Oracle geholt und in Mysql importiert, dort gelingt mir das mit group_concat um einiges unkomplizierter, die Oracle DB hier ist auch ne 8.1.6 :-/
 

Neue Beiträge

Zurück