2016-07-07 6 views
0

Sagen, ich habe die unten stehende DatenmengeWie verketteten Spalten in SQL zu manipulieren

WITH dataset (hno,sorder,level,dummy,maxorder) AS 
(
SELECT 1, 1, 'val1', 'NULL1', 5 FROM dual UNION ALL 
SELECT 1, 2, 'val2', 'NULL2', 5 FROM dual UNION ALL 
SELECT 1, 3, 'val3', 'NULL3', 5 FROM dual UNION ALL 
SELECT 1, 4, 'val4', 'NULL4', 5 FROM dual UNION ALL 
SELECT 1, 5, 'val5', 'NULL5', 5 FROM dual) 
SELECT * 
FROM dataset; 

HNO SORDER LEVEL DUMMY MAXORDER 
1  4 val4 NULL4 5 
1  2 val2 NULL2 5 
1  3 val3 NULL3 5 
1  1 val1 NULL1 5 
1  5 val5 NULL5 5 

Und ich brauche eine andere Spalte haben genannt TEXT

HNO SORDER LEVEL DUMMY MAXORDER TEXT 
1  4 val4 NULL4 5   val1,val2,val3,val4,NULL5 
1  2 val2 NULL2 5   val1,val2,NULL3,NULL4,NULL5 
1  3 val3 NULL3 5   val1,val2,val3,NULL4,NULL5 
1  1 val1 NULL1 5   val1,NULL2,NULL3,NULL4,NULL5 
1  5 val5 NULL5 5   val1,val2,val3,val4,val5 

Die Idee für die dynamischen SQL-Platzhalter zu manipulieren ist. Also, wenn die Sortierreihenfolge ist ein Bereich zwischen 1 ... n dann für einen SORDER Wert x, muss ich Werte aus der Spalte LEVEL für 1 bis x und dann von Dummy für x + 1 bis n und alle von ihnen als Komma verkettet getrennte Werte und vor allem alle in einem SQL. Diese maximale Reihenfolge kann eine beliebige Zahl sein und ist nicht festgelegt. WX2 hat keinen rekursiven CTE, was es schwierig macht.

Irgendwelche Zeiger?

+0

Ich würde Ihnen vorschlagen, eine skalare Funktion zu erstellen, die den verketteten Wert auf der Basis der sorder produzieren als Eingabeparameter. Ansonsten kann ich keine Möglichkeit finden, diese Logik mit einem Datensatz zu machen. –

+0

Müssen Sie eine TEXT-Spalte für nur eine Zeile (SORDER = X) zurückgeben, oder müssen Sie sie für alle Zeilen generieren? –

+0

müssen für alle Zeilen generiert werden – SriniV

Antwort

0

Diese Funktion Strings verkettet basierend auf der Logik, die Sie beschrieben (Test ist der Name der Tabelle mit Daten):

CREATE FUNCTION Concatenate_string 
(
    @sorder int 
) 
RETURNS varchar(1000) 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @result varchar(1000)='' 
    declare @i int=1 
    while @i<=(select max(sorder) from test) 
    begin 
     set @[email protected] + (select case when @i <= @sorder then level else dummy end+',' from test where [email protected]) 
     set @[email protected]+1 
    end 

    return @result 


END 
GO 
+0

WX2 nicht solche Skalarfunktionen und wir müssen dies in Plain SQL tun. Auch die Syntax sieht wie SQL-SERVER aus !! – SriniV

+0

Ja, es ist T-SQL. Ich habe verpasst, dass du das in wx2 machst. Es tut uns leid. –