2016-10-19 3 views
1

私は問題を解決できるアプローチを認識していますが、派生テーブルのorder by句はカスタムソートを台無しにしています。私の入力と出力の詳細と私が試したことはここにあります。派生テーブルのorder by句を含むカスタムソートの実行

スキーマ: - 入力: -

CREATE TABLE Test(Rowname VARCHAR(10), Col1 DATETIME, Col2 DATETIME, Col3 DATETIME, Col4 DATETIME); 

     INSERT INTO Test VALUES('Row1', '2016-01-14', '2016-01-08', '2016-01-30', '2016-01-01'); 
     INSERT INTO Test VALUES('Row2', '2016-01-02', '2016-01-01', '2016-01-18', '2016-01-15'); 

予想される出力は: -

RowName Result 
Row1  Col4,Col2,Col1,Col3 
Row2  Col2,Col1,Col4,Col3 

私が試してみましたか?

WITH CTE(RowName,Colmn,RN) AS 
(
SELECT RowName,Colmn,ROW_NUMBER() OVER(PARTITION BY RowName ORDER BY RowName) AS RN 
     FROM 
      ( 
       (SELECT RowName,Col1 AS Col,'Col1' AS Colmn FROM Test) 
       UNION ALL 
       (SELECT RowName,Col2 AS Col,'Col2' AS Colmn FROM Test) 
       UNION ALL 
       (SELECT RowName,Col3 AS Col,'Col3' AS Colmn FROM Test) 
       UNION ALL 
       (SELECT RowName,Col4 AS Col,'Col4' AS Colmn FROM Test) 
      ) Z 
     ORDER BY RowName,Col 
) 
SELECT RowName, 
     MAX((CASE WHEN RN = 1 THEN Colmn END)) + ',' + 
     MAX((CASE WHEN RN = 2 THEN Colmn END)) + ',' + 
     MAX((CASE WHEN RN = 3 THEN Colmn END)) + ',' + 
     MAX((CASE WHEN RN = 4 THEN Colmn END)) AS Result 
    FROM CTE 
GROUP BY RowName; 

注: -

RowName BY ORDERそれがSQL Serverで許可されていないとして、内側のクエリ/派生テーブル内のコル句が失敗しています。このORDER BYを使用しない場合、ORDER BY句を使用せずにカスタムソートを実行するにはどうすればよいですか?

答えて

1

あなたorder byover句で定義する必要があります。

WITH CTE(RowName,Colmn,RN) AS 
(
SELECT 
    RowName,Colmn,ROW_NUMBER() OVER( 
     PARTITION BY RowName 
     ORDER BY RowName, Col  -- add Col here 
    ) AS RN 
    FROM 
    ( 
     (SELECT RowName,Col1 AS Col,'Col1' AS Colmn FROM Test) 
     UNION ALL 
     (SELECT RowName,Col2 AS Col,'Col2' AS Colmn FROM Test) 
     UNION ALL 
     (SELECT RowName,Col3 AS Col,'Col3' AS Colmn FROM Test) 
     UNION ALL 
     (SELECT RowName,Col4 AS Col,'Col4' AS Colmn FROM Test) 
    ) Z 
    -- ORDER BY RowName,Col -- remove this line 
) 
SELECT RowName, 
     MAX((CASE WHEN RN = 1 THEN Colmn END)) + ',' + 
     MAX((CASE WHEN RN = 2 THEN Colmn END)) + ',' + 
     MAX((CASE WHEN RN = 3 THEN Colmn END)) + ',' + 
     MAX((CASE WHEN RN = 4 THEN Colmn END)) AS Result 
    FROM CTE 
GROUP BY RowName; 
0

row_numberにorder byにcolを追加すると、必要な順序で並べ替えられます。

ROW_NUMBER() OVER(PARTITION BY RowName ORDER BY RowName, col) 
0
declare @test TABLE(Rowname VARCHAR(10), Col1 DATETIME, Col2 DATETIME, Col3 DATETIME, Col4 DATETIME); 

     INSERT INTO @test VALUES('Row1', '2016-01-14', '2016-01-08', '2016-01-30', '2016-01-01'); 
     INSERT INTO @test VALUES('Row2', '2016-01-02', '2016-01-01', '2016-01-18', '2016-01-15'); 



;with cte as(
    select a.Rowname, 'Col' + b.ID as ColName, b.Col from @test as a 
    outer apply (select * from (values ('1', Col1), ('2', Col2), ('3', Col3), ('4', Col4)) as t(ID, Col)) as b 
) 
    select Distinct Rowname, 
      (Select ColName + ', ' From cte as b 
      Where b.Rowname=a.Rowname 
      order by b.Col for xml path(''), type).value('.', 'varchar(30)') as ColList 
    from cte as a 
関連する問題