SQL Oracle abgefragte Felderanders ausgeben

Hallo zusammen,

ich will aus einer Oracle DB Daten abfragen und zusammengefasst ausgeben.

ein kleine Bsp.:
Tabelle Auto

Kennzeichen Schaden
xx-121 Tür
xx-121 Spiegel
xx-365 Motor

Das Abfrageergebnis soll wie folgt aussehen:

Kennzeichen Tür Spiegel Motor
xx-121 x x
xx-365 x

Es wäre cool, falls einer eine lösungsidee hätte.

Vielen Dank

Kann dir bei Oracle DBs leider nicht weiterhelfen.

Johannes.

Hallo db_hans,

angenommen, Deine Tabelle Auto hat noch eine Primary Key Spalte ‚ID‘,
dann könntest Du wie folgt abfragen:

SELECT a1.kennzeichen
, (SELECT ‚x‘ FROM auto a2 WHERE a2.schaden = ‚Tür‘ a2.ID = a1.ID) AS ‚Tür‘
, (SELECT ‚x‘ FROM auto a2 WHERE a2.schaden = ‚Spiegel‘ a2.ID = a1.ID) AS ‚Spiegel‘
, ‚und so weiter‘
FROM auto a1;

Die Menge der Spalten, die Du selektierst, ist nicht dynamisch. D.H. kommt eine
neue Schadensart hinzu (‚Batterie‘, o.ä.), musst Du Deine Abfrage ergänzen.

Um eine dynamische Abfrage zu generieren, könntest Du mit PLSQL oder mit einer
Progrmmiersprache, die eine JDBC-Verbindung aufbaut, eine Lösung suchen.

Das folgende Statement ermittelt alle untersichtlichen Schadensarten:
SELECT DISTINCT(schaden) FROM auto;

Besser wäre es jedoch, für die unterschiedlichen Arten eine eigene Tabelle anzulegen.

Berthold

Hallo Berthold,

danke für die schnelle antwort.

Hallo,

ich nehme an, es geht darum, das Abfrageergebnis mit einem einzelnen SELECT zu erstellen.
Das wird so nicht funktionieren, da offenbar die möglichen Schaden-Einträge variabel sind und nicht auf die drei Beispiele begrenzt.
Ohne etwas Programmcode wird es nicht gehen.

Gruß
Erhard

Hallo zusammen,

ich will aus einer Oracle DB Daten abfragen und
zusammengefasst ausgeben.

ein kleine Bsp.:
Tabelle Auto

Kennzeichen Schaden
xx-121 Tür
xx-121 Spiegel
xx-365 Motor

Das Abfrageergebnis soll wie folgt aussehen:

Hallo Hans,

ein Lösungsansatz aus meiner Sicht:

select kennzeichen, decode(sum(tür),1,‚x‘) tür, decode(sum(motor),1,‚x‘) motor, decode(sum(spiegel),1,‚x‘) spiegel

from (select kennzeichen, case when schaden = ‚Tür‘ then 1 else 0 end as tür, case when schaden = ‚Motor‘ then 1 else 0 end as motor, case when schaden = ‚Spiegel‘ then 1 else 0 end as spiegel from auto
)

group by kennzeichen

Anmerkungen:

  • Eingeschränkte Werte, was die Case-Funktion anbetrifft
  • 1 und 0 in der Case-Funktion dienen der Summierung, werden hinterher per Decode umgesetzt, sobald ein Kennzeichen einen Schaden doppelt hinterlegt hat, wird der nicht mehr angezeigt (da Wert=2). Kann aber per Unique Index auf Tabelle AUTO abgefangen werden.

Ich hoffe, geholfen zu haben, bei weiteren Fragen nur zu.

G Lars

Hallo,
hab mal was probiert - ist zwar nicht so elegant,
funktioniert aber…
-------- SCHNIPP ------
set serveroutput on
declare
v_ausgabe0 varchar2(100) := ’ ‚;
v_ausgabe1 varchar2(100) := ’ X‘;
v_ausgabe varchar2(100);
v_nr varchar2(10) := ‚-‘;
v_count pls_integer := 0;

begin
dbms_output.put_line(‚NR TÜR SPIEGEL‘);
for rec in (select distinct Kennzeichen from Auto order by Kennzeichen)
loop
v_ausgabe := null;
v_count := 0;
for rec1 in (select * from Auto where Kennzeichen = rec.Kennzeichen)
loop
v_count := v_count +1;

if rec1.Schaden = ‚TÜR‘ then
v_ausgabe := v_ausgabe||v_ausgabe1;
elsif rec1.Schaden = ‚SPIEGEL‘ then
if v_count = 1 then
v_ausgabe := v_ausgabe||v_ausgabe0||v_ausgabe1;
else
v_ausgabe := v_ausgabe||v_ausgabe1;
end if;
end if;

end loop;
dbms_output.put_line(rec.Kennzeichen||’ '||v_ausgabe);

end loop;

end;

----- SCHNAPP ------

Viel Spaß
Wolfgang

Hallo Hans,

So eine Darstellung ist mit SQL nicht leicht zu realisieren, deswegen würde ich die Daten in der Applikation entsprechend aufbereiten.

Schöne Grüße, Robert

hey
ich kenne mich in oracle datenbanken nicht aus