PDA

View Full Version : SQL über 2 Dateien



Jenne
02-07-13, 15:05
Hallo Kollegen,

ich habe ein Problem und bekomme das nicht gelöst.

Tabelle 1:
Feld_Artikel_Nr
007

Tabelle 2:

Feld_Artikel_Nr Preis
007 1,00
007 2,00
007 3,00


Jetzt möchte ich eine View erstellen die folgendermaßen aussehen sollte:

View:


Feld_Artikel_Nr Preise


007 1,00 - 2,00 - 3,00
Ich muss also aus 3 Preisfeldern ein Textfeld (mit concat) erstellen.

Problem ist das die Anzahl der Preise aus Tabelle 2 unterschiedlich sein können. Mal haben wir ein Preis, aber bei einigen auch 5 Preise.

Vielleicht kann mir einer helfen.

Danke im Voraus
Jenne

Fuerchau
02-07-13, 15:16
Es können aber auch 10 Preise oder mehr werden?
Ab V7R1 siehe hier:
http://newsolutions.de/forum-systemi-as400-i5-iseries/newsboard-programmierung/17975-sql-ergebniskette.html?highlight=with+concat

Ansonten gehts halt mit eingeschränkter Auswahl:

select Artikel
,coalesce(char(a.Preis), '')
concat coalesce(' - ' concat char(b.preis), '')
concat coalesce(' - ' concat char(c.preis), '')
from table1 x
left join table2 a on x.Artikel=a.Artikel
left join table2 b on x.Artikel=b.Artikel

Je nach Anzahl ist der Concat und Left Join zu erweitern.
Der "char(...)" sollte ggf. noch mit "trim(char(...))" ergänzt werden.

Dabei frage ich mich, wofür eine Denormalisierung gut sein soll.

B.Hauser
03-07-13, 06:25
Es können aber auch 10 Preise oder mehr werden?
Ab V7R1 siehe hier

Rekursive Common Table Expressions sind bereits seit V5R4 möglich. Die hierarchische Query Anweisung (START WITH CONNECT BY) wurde dagegen erst mit Release 7.1 TR3 eingeführt.

Ansonsten kann man sich immer noch eine kleine User Defined Function (UDF) bauen, etwa so:

CREATE FUNCTION MySchema/MyUDF (
PARARTNR CHAR(5) )
RETURNS VARCHAR(1024)
LANGUAGE SQL
READS SQL DATA
BEGIN

DECLARE RETURNVAL VARCHAR ( 1024 ) NOT NULL DEFAULT ' ' ;

FOR CSRC1 AS C1 CURSOR
FOR SELECT Preis
FROM TABLE2
WHERE ARTNR = PARARTNR
DO SET RETURNVAL = RETURNVAL CONCAT ' ' CONCAT VarChar(CSRC1.Preis) ;
END FOR ;

RETURN LTRIM(RETURNVAL) ;
END ;


Der Aufruf kann wie folgt aussehen:

Select Distinct ArtNr, MyUDF(ArtNr)
From Table1;

Birgitta