PDA

View Full Version : SQL - Zeilen in Spalten



Seiten : [1] 2

muadeep
06-11-09, 08:12
Hallo *all

hab mal wieder eine SQL-Frage

habe eine Tabel die ungefähr wie folgt aus sieht:


WERKNR SA TEXT

7500691 AU Zylinder
7500691 AU Hand
7500691 AU Papierstau.
7500691 KR Anruf
7500691 KR ebenso
7500691 KR Info
7500691 KR Bürste
7500691 MA nachgeschickt
7500691 MA neu
ich bräuchte diese Daten jetzt aber so:

Feld1 Feld2 Feld3 Feld4 Feld5 Feld6 Feld7 Feld8 Feld9

Zylinder Hand Papierstau Anruf Ebenso Info Bürste nachgeschickt neu
die Zeilenzahl kann variieren
d.h. es können mal bei "AU" eine aber auch mal sieben Sätze vorhanden sein!sein! Ebenso bei "KR" bzw. "MA"

Diese Abfrage soll anschließend noch mit Join, mit einer anderen Tabelle (über WERKNR) verknüpft werden!

cbe
06-11-09, 10:10
furchtbar.

Wie willst du denn die Datei weiterverarbeiten, wenn die Spaltenzahl variabel ist?

Wenn es z.B. als CSV verschickt wird, würde ich einfach ein RPG schreiben, das die Sätze liest und mit CAT aneinanderhängt.
Kann dann mit CPY2STMF oder FTP oder sonstwie weiterverarbeitet werden.

Sag doch mal mehr dazu.
Und gibt es in der urspr. Tabelle auch eine Sortierung oder ist die sequenziell zufällig?

Gruß, Christian

Spateneder
06-11-09, 10:11
Ich kann Dir nicht ganz folgen. Willst Du keine Gruppierung/Sortierung? Einfach alle TEXT-Spalten nebeneinander in einer Zeile, so wie es jetzt dargestellt ist?

muadeep
06-11-09, 10:42
bei folgendem Select

Select * from MyFile where WERKNR = 7500691'erhalte ich alles was zur Werknummer 7500691 gehört
(siehe PHP-Code 1)!

ich brächte aber alle "TEXT"-Inhalte zu dieser Werknr. in einer Zeile angeordnet
(siehe PHP-Code 2)!

Pikachu
06-11-09, 10:44
Wenn du die maximale Anzahl an Wiederholungen kennst, kannst du es vielleicht so versuchen:
SELECT A.TEXT, B.TEXT, C.TEXT, D.TEXT,
E.TEXT, F.TEXT, G.TEXT, H.TEXT, I.TEXT
FROM (
SELECT MIN(RRN(A)) AS MINA,
MIN(RRN(B)) AS MINB,
MIN(RRN(C)) AS MINC,
MIN(RRN(D)) AS MIND,
MIN(RRN(E)) AS MINE,
MIN(RRN(F)) AS MINF,
MIN(RRN(G)) AS MING,
MIN(RRN(H)) AS MINH,
MIN(RRN(I)) AS MINI
FROM ROWCOL AS A
LEFT OUTER JOIN ROWCOL AS B ON RRN(B)>RRN(A)
LEFT OUTER JOIN ROWCOL AS C ON RRN(C)>RRN(B)
LEFT OUTER JOIN ROWCOL AS D ON RRN(D)>RRN(C)
LEFT OUTER JOIN ROWCOL AS E ON RRN(E)>RRN(D)
LEFT OUTER JOIN ROWCOL AS F ON RRN(F)>RRN(E)
LEFT OUTER JOIN ROWCOL AS G ON RRN(G)>RRN(F)
LEFT OUTER JOIN ROWCOL AS H ON RRN(H)>RRN(G)
LEFT OUTER JOIN ROWCOL AS I ON RRN(I)>RRN(H)
) AS MIN
LEFT OUTER JOIN ROWCOL AS A ON RRN(A)=MINA
LEFT OUTER JOIN ROWCOL AS B ON RRN(B)=MINB
LEFT OUTER JOIN ROWCOL AS C ON RRN(C)=MINC
LEFT OUTER JOIN ROWCOL AS D ON RRN(D)=MIND
LEFT OUTER JOIN ROWCOL AS E ON RRN(E)=MINE
LEFT OUTER JOIN ROWCOL AS F ON RRN(F)=MINF
LEFT OUTER JOIN ROWCOL AS G ON RRN(G)=MING
LEFT OUTER JOIN ROWCOL AS H ON RRN(H)=MINH
LEFT OUTER JOIN ROWCOL AS I ON RRN(I)=MINI

muadeep
06-11-09, 11:34
die max. Anzahl ist mir leider nicht bekannt! :-(

muadeep
06-11-09, 11:52
dachte da irgendwie so in der Art!


select a.WERKNR,a.TEXT,b.TEXT,c.TEXT
from MyFile a, MyFile b, MyFile c
where (a.WERKNR = b.WERKNR and b.WERKNR = c.WERKNR) and a.WERKNR = '7500691'

B.Hauser
06-11-09, 12:11
Hallo,

wenn die Anzahl der Vorkommen nicht feststeht hast Du mit einer Tabelle schlechte Karten, da Du eine feste Anzahl Spalten definieren musst. Das einzige was Du machen kannst ist die einzelnen Texte in einem String aufzubereiten und dann in einem einzigen Feld ausgeben. Dies kann mit einer selbstgestrickten SQL-Funktion realisiert werden.

Beispiel:

CREATE FUNCTION MySchema/MyFunc (
PARWerkNr Char(10), ParSA Char(2) )
RETURNS VARCHAR(1024)
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
BEGIN
DECLARE RETURNVAL VARCHAR ( 1024 ) NOT NULL DEFAULT ' ' ;
FOR CSRC1 AS C1 CURSOR
FOR SELECT Text
FROM MyTable
WHERE WerkNr = PARWerkNr
and SA = ParSA
DO SET ReturnVal = ReturnVal CONCAT ' ' CONCAT CsrC1.Text;
END FOR ;
RETURN LTRIM(ReturnVal) ;
END;

Die Funktion kann wie folgt verwendet werden:

Select Distinct WerkNr, SA, MyFunc(WerkNr, SA)
From MyTable
Where WerkNr = '4711';

Das Ergebnis sollte in etwa so aussehen:

WerkNr SA Text
7500691 AU Zylinder Hand Papierstau
7500691 KR Anruf ebenso Info Bürste
7500691 MA nachgeschickt neu

Birgitta

muadeep
06-11-09, 13:11
schaut ja schon mal nicht schlecht aus! *fg

kann man die Funktion jetzt noch so machen, daß ich nur eine Zeile bekomme!

WERKNR & SA interessieren mich nicht


Textfeld1 Textfeld2 Textfeld 3
Zylinder Hand Papierstau Anruf ebenso Info Bürste nachgeschickt neu

Fuerchau
06-11-09, 15:54
Ist denn die Anzahl der Begriffe wenigstens bekannt ?
Dann könntest du folgenden Select stricken:

select Text, ' ', ' ', ... from File
where Text = 'Begriff1'
union [all]
select ' ', Text, ' ', ... from File
where Text = 'Begriff2'
union [all]
select ' ', ' ', Text, ... from File
where Text = 'Begriff3'

Dies ist entsprechend der Anzahl möglicher Begriffe zu erweitern.