巨大な編集
@Joro のアプローチには同意しますが、もう少し冗長でシンプルな方法があることに気付きました。
テーブルのコピーを作成し、それをレッスンと呼びましたが、そこには 12 のレッスンしか入れていませんが、同じ方法でクエリを生成できます。
次のクエリを使用 ( INFORMATION_SCHEMA.COLUMNSを使用):
SELECT 'SELECT ID, ''' + COLUMN_NAME + ''' AS LessonName,
[' + COLUMN_NAME + '] AS Lesson ' +
+ 'FROM Lesson WHERE ID = @ID AND LEN([' + COLUMN_NAME + ']) > 2 UNION'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Lesson'
AND DATA_TYPE = 'varchar'
次のようなクエリを生成します。
SELECT ID, 'Lesson 1' AS LessonName, [Lesson 1] AS Lesson
FROM Lesson WHERE ID = @ID AND LEN([Lesson 1]) > 2 UNION
SELECT ID, 'Lesson 2' AS LessonName, [Lesson 2] AS Lesson
FROM Lesson WHERE ID = @ID AND LEN([Lesson 2]) > 2 UNION
... (SQL omitted for brevity)
SELECT ID, 'Lesson 12' AS LessonName, [Lesson 12] AS Lesson
FROM Lesson WHERE ID = @ID AND LEN([Lesson 12]) > 2 UNION
最後の UNION を削除し、@ID を 35 として宣言してクエリを実行すると、次のようになります。
|| ID || LessonName || Lesson
|| 35 || Lesson 4 || Maths
|| 35 || Lesson 9 || ICT
|| 35 || Lesson 12 || English
次に、上記の手法を使用してこれをピボットすることができると思いました...しかし、別の方法がありました-実際に必要な列はLessonName列にあるため、おそらく動的SQLクエリを実行するだけで済みますこれらの列名は次のとおりです。
DECLARE @ColumnList VARCHAR(MAX)
SELECT @ColumnList = COALESCE(@ColumnList + ', ','') + '[' + Lessons.LessonName + ']'
FROM (
SELECT ID, 'Lesson 1' AS LessonName, [Lesson 1] AS Lesson FROM Lesson WHERE ID = @ID AND LEN([Lesson 1]) > 2 UNION
SELECT ID, 'Lesson 2' AS LessonName, [Lesson 2] AS Lesson FROM Lesson WHERE ID = @ID AND LEN([Lesson 2]) > 2 UNION
...
SELECT ID, 'Lesson 12' AS LessonName, [Lesson 12] AS Lesson FROM Lesson WHERE ID = @ID AND LEN([Lesson 12]) > 2)
AS Lessons
結果が得られます'[Lesson 4], [Lesson 9], [Lesson 12]'
次に、次のことを行うことができます。
DECLARE @QuerySQL NVARCHAR(MAX)
SET @QuerySql = 'SELECT ' + CAST(@ID AS VARCHAR) + ' AS ID, ' + @ColumnList + ' FROM Lesson WHERE ID = @ID'
--Query actually looks like: SELECT 35 AS ID, [Lesson 4], [Lesson 9], [Lesson 12]
-- FROM Lesson WHERE ID = 35
DECLARE @ID INT --You will already have done this above anyway really
SET @ID = 35
EXEC sp_executeSQL @QuerySql,N'@ID int', @ID
どちらが返されますか:
|| ID || Lesson 4 || Lesson 9 || Lesson 12
|| 35 || Maths || ICT || English
ピボット関数を使用する別の方法 - この SQL を一度簡単に生成して、ストアド プロシージャに残すことができます。
したがって、これをまとめると、使用法は次のようになります。
DECLARE @ID INT
SET @ID = 35
DECLARE @ColumnList VARCHAR(MAX)
SELECT @ColumnList = COALESCE(@ColumnList + ', ','') + '[' + Lessons.LessonName + ']'
FROM (
SELECT ID, 'Lesson 1' AS LessonName, [Lesson 1] AS Lesson FROM Lesson WHERE ID = @ID AND LEN([Lesson 1]) > 2 UNION
SELECT ID, 'Lesson 2' AS LessonName, [Lesson 2] AS Lesson FROM Lesson WHERE ID = @ID AND LEN([Lesson 2]) > 2 UNION
...
SELECT ID, 'Lesson 35' AS LessonName, [Lesson 35] AS Lesson FROM Lesson WHERE ID = @ID AND LEN([Lesson 35]) > 2)
AS Lessons --Remember you can generate this section quite simply using information_schema.columns
--and you don't actually need the ID or Lesson columns - just the lesson names.
DECLARE @QuerySQL NVARCHAR(MAX)
SET @QuerySql = 'SELECT ' + CAST(@ID AS VARCHAR) + ' AS ID, ' + @ColumnList + ' FROM Lesson WHERE ID = @ID'
EXEC sp_executeSQL @QuerySql,N'@ID int', @ID
それはあなたが望む答えを与えるでしょう。
GUI レベルでデータをピボットすることに注意してください (Excel ピボット テーブルまたは DevExpress Pivot Grid などのサード パーティ コンポーネントを介して、最初の結果セット (UNION クエリの出力) で停止できることを意味します)。