jk23jk
Goto Top

SQL Zeilen Verketten

Hallo zusammen,

vermutlich eine simple Übung für einige von euch aber ich stehe irgendwie auf dem Schlauch.

Es geht darum, dass ich eine SQL Abfrage habe die pro Kunden Nr. mehrer Text Zeilen ausgibt. diese Textzeilen würde ich gerne Pro Kunden Nummer verketten.

Kann mir jmd auf die Sprünge helfen ?

Text KundenNr Zeile "Ergebnis Final"

Beispiel 12345 0 Beispiel Für Admin.de
Für 12345 1
ADMIN 12345 2
.de 12345 3

Ein 98765 0 Ein Weiteres Beispiel Für Admin.de
Weiteres 98765 1
Beispiel 98765 2
Für 98765 3
Admin 98765 4
.de 98765 5


Ja, ich habe die verschiedesten Möglichkeiten im Netz gefunden.
Allerdings bekomme ich es irgendwie nicht gebacken Sorry ( ich hoffe es liegt nicht an der Hitze die hier herrscht)

Vielen Dank vorab.

Beste Grüße

Content-ID: 276033

Url: https://administrator.de/forum/sql-zeilen-verketten-276033.html

Ausgedruckt am: 22.12.2024 um 23:12 Uhr

JK23JK
JK23JK 30.06.2015 um 11:44:21 Uhr
Goto Top
Ich sehe er kommt nicht ganz mit der Formatierung klar.

Mehrer Spalten

1 Text - 2 KundenNr - 3 Kunde - 4 Zeile

Mehrer Zeilen pro Kunden Nr. mit verschiedenen Texten pro Zeile die verkettet werden sollen.
LianenSchwinger
LianenSchwinger 30.06.2015 aktualisiert um 12:06:45 Uhr
Goto Top
Hallo,

für welche Datenbank soll die Abfrage sein?

In Oracle 11GR2 und höher wäre folgendes denkbar

SELECT a.KundenNr,
       LISTAGG(a.Text, ' ') WITHIN GROUP (ORDER BY a.Zeile) Text  
FROM TabelleXY a
GROUP BY a.KundenNr
ORDER BY a.KundenNr

G Jörg
JK23JK
JK23JK 30.06.2015 um 12:04:57 Uhr
Goto Top
per SQL auf eine AS400

die Anfrage an sich steht schon - die Frage ist jetzt nur wie den Text in den verschiedenen Zeilen zu einem zusammenhängenden Text verketten kann
ukulele-7
ukulele-7 30.06.2015 um 12:05:33 Uhr
Goto Top
Da du keinen Ansatz und kein Wunschergebnis gepostet hast, poste ich auch mal nur einen Link zu einer Lösung von der ich glaube das du sie suchst:
http://stackoverflow.com/questions/17591490/how-to-make-a-query-with-gr ...

Es geht im Prinzip darum Text durch verketten zu aggregieren. Dazu gibt es in MSSQL keine direkte Funktion, in MySQL gibt es z.B. GROUP_CONCAT. In MSSQL gibt es den gängigen Weg über XML PATH, siehe Link.
JK23JK
JK23JK 30.06.2015 um 12:21:52 Uhr
Goto Top
Der Ansatz ist dieser hier:

SELECT KDST.K2TEXT AS Text, KDST.KDKDNR AS KundenNr, KDST.KDNAM1 AS Kunde, KDST.KDORT AS KundenOrt, KDST.KDVNR AS KundenVertreterNr,
KDST.KDLAND AS KundenLand, test.dbo.vwSchl_Vertreter.Vertreter, KDST.HEADERTXT AS Textbaustein, KDST.K2POS AS Zeile, KDST.KDNAM2, KDST.KDNAM3,
KDST.KDSTR, KDST.KDPLZ
FROM OPENQUERY(test_ODBC,
'Select KDST.* , KDST2.*, KDST2LF.K2TEXT as HeaderTxt
from test.KDST2 KDST2
inner join test.KDST KDST on KDST.KDFA = KDST2.K2FA and KDST2.K2KDNR = KDST.KDKDNR
inner join test.KDST2LF KDST2LF on
KDST2LF.K2BANR = KDST2.K2BANR AND KDST2LF.K2SPRA = KDST2.K2SPRA AND KDST2LF.K2KDNR = KDST2.K2KDNR AND KDST2LF.K2FA = KDST2.K2FA


where KDST2.K2FA = 1 ')
AS KDST INNER JOIN
test.dbo.vwSchl_Vertreter ON KDST.KDVNR = test.dbo.vwSchl_Vertreter.VNR
WHERE (KDST.HEADERTXT = 'lieferanweisung')
LianenSchwinger
LianenSchwinger 30.06.2015 um 13:04:42 Uhr
Goto Top
bin mal so frei ...
SELECT KDST.K2TEXT AS Text, 
       KDST.KDKDNR AS KundenNr, 
       KDST.KDNAM1 AS Kunde, 
       KDST.KDORT AS KundenOrt, 
       KDST.KDVNR AS KundenVertreterNr,
       KDST.KDLAND AS KundenLand, 
       test.dbo.vwSchl_Vertreter.Vertreter, 
       KDST.HEADERTXT AS Textbaustein, 
       KDST.K2POS AS Zeile, 
       KDST.KDNAM2, 
       KDST.KDNAM3, 
       KDST.KDSTR, 
       KDST.KDPLZ
 FROM OPENQUERY(test_ODBC, 
      'SELECT KDST.* , KDST2.*, KDST2LF.K2TEXT as HeaderTxt  
       FROM test.KDST2 KDST2
       INNER JOIN test.KDST KDST ON KDST.KDFA = KDST2.K2FA 
                                 AND KDST2.K2KDNR = KDST.KDKDNR 
       INNER JOIN test.KDST2LF KDST2LF ON KDST2LF.K2BANR = KDST2.K2BANR 
                                       AND KDST2LF.K2SPRA = KDST2.K2SPRA 
                                       AND KDST2LF.K2KDNR = KDST2.K2KDNR 
                                       AND KDST2LF.K2FA = KDST2.K2FA
       WHERE KDST2.K2FA = 1')  
 AS KDST 
 INNER JOIN test.dbo.vwSchl_Vertreter ON KDST.KDVNR = test.dbo.vwSchl_Vertreter.VNR
 WHERE (KDST.HEADERTXT = 'lieferanweisung')  
LianenSchwinger
LianenSchwinger 30.06.2015 um 13:13:54 Uhr
Goto Top
lese ich das richtig, dass der zu verbindende Text in KDST.K2TEXT und die Zeilennummer in KDST.K2POS stehen?

Aus welcher Tabelle stammen diese Zeilen KDST, KDST2 oder KDST2LF?!?

Ich würde die Aggregierung schon in der OPENQUERY-Klausel unterbringen.
Und da es sich scheinbar um MSSQL handelt wird der Weg nur über XML PATH wie von Ukulele-7 schon geschrieben.
An dem Punkt bin ich leider raus.

G Jörg
ukulele-7
ukulele-7 30.06.2015 um 13:32:42 Uhr
Goto Top
Das Query ist wirklich unübersichtlich, vor allem solltest du nicht mit * sondern mit expliziten Spaltennamen arbeiten. Auch könntest du statt OPENQUERY einen Verbindungsserver nutzen, falls der abfragende Server MSSQL ist. Oder liegen alle Tabellen auf dem selben Server?
JK23JK
JK23JK 30.06.2015 um 13:35:31 Uhr
Goto Top
das ließt du genau richtig !

aus allen 3 face-smile

und ich eben auch ....
aber trotzdem Danke für deine Anregungen

Ich dachte man könnte evtl. einfach auf die Kunden Nr. prüfen und so lange er Zeile 0 - x für Kunden Nr. sieht/ findet verknüpft er den Text der jeweiligen Zeile (Pos)
LianenSchwinger
LianenSchwinger 01.07.2015 um 11:26:42 Uhr
Goto Top
... ich habe mir XML PATH mal angesehen und so schwer ist das ja nicht. face-smile

Versuchsweise würde ich Dir das zusammenbauen. Dazu müsste man aber genau wissen in welcher Tabelle die zu verkettenden Texte und Zeilennummer stecken. Also am Besten wie Ukulele-7 schon schrieb das OPENQUERY-SELECT nicht mit * sondern mit expliziten Spaltennamen posten.

G Jörg