0

以下のデータセットがあるとします

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の場合LEVEL、1 から x の列から値を返し、次に x+1 から n のダミーから値を返し、それらすべてをコンマ区切りの値として連結する必要がありますそして最も重要なことは、すべてが 1 つの SQL に含まれていることです。この最大順序は任意の数にすることができ、固定されていません。WX2 には再帰的な CTE がないため、困難です。

ポインタはありますか?

4

1 に答える 1

0

この関数は、説明したロジックに基づいて文字列を連結します (test はデータを含むテーブルの名前です)。

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 @result=@result + (select case when @i <= @sorder then level else dummy end+',' from test where sorder=@i)
        set @i=@i+1
    end

    return @result


END
GO
于 2016-07-07T14:00:37.640 に答える