sql >> データベース >  >> RDS >> Sqlserver

不明な列の内容をピボット

    必要な SQL は次のとおりです。

    SELECT Course1_ID =MAX(CASE WHEN RowNum =1 THEN ID END), Course1_Name =MAX(CASE WHEN RowNum =1 THEN Name END), Course2_ID =MAX(CASE WHEN RowNum =2 THEN ID END), Course2_Name =MAX(CASE WHEN RowNum =2 THEN Name END), Course3_ID =MAX(CASE WHEN RowNum =3 THEN ID END), Course3_Name =MAX(CASE WHEN RowNum =3 THEN Name END)FROM ( SELECT ID, Name, RowNum =ROW_NUMBER () OVER(ORDER BY ID) FROM Courses ) C;  

    しかし、未知のコンテンツでは、これを動的に生成する必要があります:

    DECLARE @SQL NVARCHAR(MAX) ='SELECT ' + STUFF(( SELECT ',Course' + RowNum + '_ID =MAX(CASE WHEN RowNum =' + RowNum + 'THEN ID END) ,Course' + RowNum + '_Name =MAX(CASE WHEN RowNum =' + RowNum + ' THEN Name END)' FROM ( SELECT RowNum =CAST(ROW_NUMBER() OVER(ORDER BY ID) AS VARCHAR(10)) FROM Courses ) c FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + ' FROM ( SELECT ID, Name, RowNum =ROW_NUMBER() OVER(ORDER BY ID) FROM コース ) C;'EXECUTE SP_EXECUTESQL @SQL;  

    SQL Fiddle の例

    同じ結果を得る別の方法:

    DECLARE @SQL NVARCHAR(MAX) ='';SELECT @SQL =@SQL + ',Course' + RowNum + '_ID =MAX(CASE WHEN RowNum =' + RowNum + ' THEN ID END) , Course' + RowNum + '_Name =MAX(CASE WHEN RowNum =' + RowNum + ' THEN Name END)'FROM ( SELECT RowNum =CAST(ROW_NUMBER() OVER(ORDER BY ID) AS VARCHAR(10)) FROM Courses ) c;SET @SQL ='SELECT ' + STUFF(@SQL, 1, 1, '') + ' FROM ( SELECT ID, Name, RowNum =ROW_NUMBER() OVER(ORDER BY ID) FROM Courses ) c;';EXECUTE SP_EXECUTESQL @SQL;  

    これにより、行を列に連結するための高価な XML 拡張機能が削除されます

    SQL Fiddle の例

    コースの順序が関係している場合は、 ROW_NUMBER の order by 句を変更するだけです 関数。



    1. PHP、MySQLエラー:列数が行1の値数と一致しません

    2. MySQL-列がnullの場合、別のテーブルから値を取得します

    3. mysqlへのインポート時にCSVフィールドを変更します

    4. Oracleのユーザーが使用するリソースを抑制または制限する方法はありますか?