Verkettung innerhalb einer Spalte

Magnilo

Neuer Benutzer
Beiträge
4
Hallo,

eigentlich hört sich mein Problem recht trivial an, aber ich scheitere an der Ausführung.
Vielleicht mag mich ein hilfsbereiter Geist auf den rechten Weg bringen.

Ein Select-Statement führt zu einem 1-Spaltigen Ergebnis, bestehend aus 0-9 Zeilen.

Wie kann ich diese 0-9 Zellen miteinander verketten, sodass sie ( z.B. mit einem Semikolon getrennt ) ein einzelliges Ergebnis bilden.

Für Hinweise aller Art wäre ich euch sehr dankbar.

Beste Grüße
Magnilo
 
Werbung:
Wie kann ich diese 0-9 Zellen miteinander verketten, sodass sie ( z.B. mit einem Semikolon getrennt ) ein einzelliges Ergebnis bilden.

Für Hinweise aller Art wäre ich euch sehr dankbar.

Beste Grüße
Magnilo

Mit einert String-Aggregation. Beispiel für PostgreSQL:

Du hast:

Code:
test=*# select x::text from generate_series(1,10) x;
 x
----
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
(10 rows)

Das sind als 10 TEXT-Zeilen in einer Spalte.

Aggregiert als Array:

Code:
test=*# select array_agg(x::text) from generate_series(1,10) x;
  array_agg
------------------------
 {1,2,3,4,5,6,7,8,9,10}
(1 row)

Und wieder als Text mit Semicolon:

Code:
test=*# select array_to_string(array_agg(x::text),';') from generate_series(1,10) x;
  array_to_string
----------------------
 1;2;3;4;5;6;7;8;9;10
(1 row)
 
array_agg() ist unter MSSQL nicht exsistent. Es gibt natürlich Nachahmungen:

http://stackoverflow.com/questions/...ggregation-temporarily-and-re-use-in-the-same

Ich habs mal simpel unter MSSQL versucht:
Code:
WITH t AS (
    SELECT    o1.[objid],
            cast(o1.[objid] AS VARCHAR(100)) AS ausgabe
    FROM    [dbo].[objekte] o1
    WHERE    o1.[objid] = 1
    UNION ALL
    SELECT    o2.[objid],
            cast(t.ausgabe + ', ' + cast(o2.[objid] AS VARCHAR(10)) AS VARCHAR(100)) AS ausgabe
    FROM    [dbo].[objekte] o2
    JOIN    t
    ON        o2.[objid] = t.[objid] + 1
    WHERE    o2.[objid] BETWEEN 1 AND 10
)
SELECT    *
FROM    t
 
PS: Kleine Ergänzung:
Code:
WITH t AS (
    SELECT    o1.[objid],
            cast(o1.[objid] AS VARCHAR(100)) AS ausgabe
    FROM    [dbo].[objekte] o1
    WHERE    o1.[objid] = 1
    UNION ALL
    SELECT    o2.[objid],
            cast(t.ausgabe + ', ' + cast(o2.[objid] AS VARCHAR(10)) AS VARCHAR(100)) AS ausgabe
    FROM    [dbo].[objekte] o2
    JOIN    t
    ON        o2.[objid] = t.[objid] + 1
    WHERE    o2.[objid] BETWEEN 1 AND 10
)
SELECT    t.ausgabe
FROM    t
WHERE    t.[objid] = 10
 
Hallo Ukulele!

Vielen Dank für deinen Beitrag. Ich glaube, dein Weg führt zum Ziel. Leider kann ich dein Statement noch nicht ganz verstehen und damit umsetzen.

Vielleicht wärest du so freundlich und schaust mal folgendes an:

select distinct c015 as LiefArtikelNr
from t043
wheremesocomp = 'xxxx'
andmesoyear = 1368
and c001 = 13
and c003 IN ('1','2','3','4','5','6','7','8','9')
and c000 = '12345'

Dieses generiert mir im Augenblick die Spalte mit den zu verkettenden Elementen.

Als blutiger Anfänger in MS SQL ist mir derzeit noch nicht klar, wie ich das in dein Script implementiert bekomme.
Wenn ich es richtig verstehe fragst du das erste Element ab und hängst im Folgenden den Rest 2-9 ran.

Eine Erklärung was o1,[objektid] und [objekte] sind, würde mir sicher etwas Licht ins Dunkle bringen.

Beste Grüße
Magnilo
 
Also objektid ist die Spalte aus der Tabelle objekte die ich einfach bei mir zum testen genommen habe.

Die Lösung ist in der Tat sehr umständlich bzw. selbst für mich etwas schwierig. Bei deinem DISTINCT komme ich auch ganz schön ins Wanken, ich habe es aber trotzdem mal versucht zu lösen:
Code:
WITH t AS (
    SELECT    DISTINCT
            cast(o1.c003 AS INT) AS c003,
            cast(o1.c015 AS VARCHAR(100)) AS LiefArtikelNr
    FROM    t043 o1
    WHERE    cast(o1.c003 AS INT) = 1
    AND        mesocomp = 'xxxx'
    AND        mesoyear = 1368
    AND        c001 = 13
    AND        c000 = '12345'
    UNION ALL
    SELECT    cast(o2.c003 AS INT) AS c003,
            cast(t.LiefArtikelNr + ', ' + cast(o2.c015 AS VARCHAR(10)) AS VARCHAR(100)) AS LiefArtikelNr
    FROM    (    SELECT    c003,
                        c015
                FROM    t043
                WHERE    mesocomp = 'xxxx'
                AND        mesoyear = 1368
                AND        c001 = 13
                AND        c000 = '12345'
            ) o2
    JOIN    t
    ON        o2.c003 = cast(t.c003 AS INT) + 1
    WHERE    cast(o2.c003 AS INT) BETWEEN 1 AND 9
)
SELECT    t.LiefArtikelNr
FROM    t
WHERE    t.c003 = 9
Absolut keine Ahnung ob das läuft, vor allem wenn man Zahlen und Text rumkonvertiert. Für mich als Außenstehender stellt sich zunächst mal die Frage nach dem Sinn :)
 
Werbung:
Der Sinn ist folgender:

Das Resultat ist eine Kette von Lieferanten-Artikel-Nummern, die einer bekannten Artikelnummer zuzuordnen sind. Eine rein informatorisch Größe, die in einem Textfeld einer ERP-Software hinterlegt werden soll. So entstand das Problem:
bis zu 9 Ergebnisse aber nur ein Feld zum beschreiben.

Danke für den Versuch der Umsetzung. Ich werde spätestens morgen berichten, ob sich deine Mühe gelohnt hat.
 
Zurück
Oben