2016-07-07 76 views
0

串聯列說我有下面的數據集如何操縱SQL

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 

,我需要有另一列稱爲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 

的想法是操縱動態佔位符的SQL。因此,如果排序順序是1 ... n之間的範圍,那麼對於SORDER值x,我需要將列1中的值從LEVEL返回給x,然後從x + 1中的虛擬值返回到n,並將所有值連接爲逗號分離的值,最重要的是全部在一個SQL中。這個最大訂單可以是任何數字,它不是固定的。 WX2缺乏遞歸CTE,這使得它很難。

任何指針?

+0

我建議你創造出將根據sorder產生連結值標量函數作爲輸入參數。否則,我無法找到一種方法來創建一組數據的邏輯。 –

+0

您是否需要僅爲一行返回TEXT列(SORDER = X),還是需要爲所有行生成它? –

+0

需要爲所有行生成 – SriniV

回答

0

這個函數連接根據您所描述的邏輯串(測試數據表的名稱):

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沒有這樣的標量函數,我們需要在普通的SQL中執行此操作。此外,語法看起來像SQL服務器! – SriniV

+0

是的,它是T-SQL。我錯過了你在wx2中這樣做。抱歉。 –