SQL Server で行を列に転置することは、表形式で格納されているデータを操作する場合の一般的なタスクです。従来、これはカーソルを使用して実現されていましたが、時間がかかり非効率的になる可能性がありました。この記事では、行の転置の代替方法を検討し、エレガントかつパフォーマンスの高いソリューションを提供します。
1 つのアプローチは、条件付き集計を使用することです。これは、COALESCE() 関数を利用して欠落を処理します。
SELECT TimeSeconds, COALESCE(MAX(CASE WHEN TagID = 'A1' THEN Value END), 'n/a') A1, COALESCE(MAX(CASE WHEN TagID = 'A2' THEN Value END), 'n/a') A2, COALESCE(MAX(CASE WHEN TagID = 'A3' THEN Value END), 'n/a') A3, COALESCE(MAX(CASE WHEN TagID = 'A4' THEN Value END), 'n/a') A4 FROM table1 GROUP BY TimeSeconds
このクエリは、欠落している値のプレースホルダー値 (「n/a」) を含む出力を生成します。 data.
もう 1 つのオプションは、動的な列の作成を可能にする PIVOT 関数を使用することです。
SELECT TimeSeconds, A1, A2, A3, A4 FROM ( SELECT TimeSeconds, TagID, Value FROM table1 ) s PIVOT ( MAX(Value) FOR TagID IN (A1, A2, A3, A4) ) p
このアプローチでは、欠落しているデータに対して NULL 値を含む出力が生成されます。 .
列の数が固定されておらず、固定でなければならない場合動的に決定される場合は、動的 SQL を使用できます。
DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX) SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(TagID) FROM Table1 ORDER BY 1 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'),1,1,'') SET @sql = 'SELECT TimeSeconds, ' + @cols + ' FROM ( SELECT TimeSeconds, TagID, Value FROM table1 ) s PIVOT ( MAX(Value) FOR TagID IN (' + @cols + ') ) p' EXECUTE(@sql)
このクエリは、テーブル内の一意の TagID 値に基づいて動的 PIVOT ステートメントを構築します。
これらのメソッドは、 SQL Server の行を列に置き換えます。データの特性とパフォーマンス要件に基づいて適切なアプローチを選択することで、データ操作タスクを簡素化し、クエリの実行効率を向上させることができます。
以上がSQL Server で行を列に効率的に転置するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。