必要な 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; プレ>
同じ結果を得る別の方法:
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 拡張機能が削除されます
コースの順序が関係している場合は、
ROW_NUMBER
の order by 句を変更するだけです 関数。