動的ピボット: 行を列に巧みに変換します
動的 SQL ステートメントは、柔軟なクエリを作成するための強力なツールです。この記事では、集計関数を使用せずに行を列に変換することに焦点を当てます。
動的視点を理解する
ピボット操作では通常、SUM や MAX などの集計関数が使用されます。ただし、場合によっては、価値の観点を直接取得することが望ましい場合があります。これには、少し異なるアプローチが必要です。
たとえば、次のソーステーブルを考えてみましょう:
<code>╔═══════════╦══════╦═══════╗ ║ TEST_NAME ║ SBNO ║ VAL ║ ╠═══════════╬══════╬═══════╣ ║ Test1 ║ 1 ║ 0.304 ║ ║ Test1 ║ 2 ║ 0.31 ║ ║ Test1 ║ 3 ║ 0.306 ║ ║ Test2 ║ 1 ║ 2.3 ║ ║ Test2 ║ 2 ║ 2.5 ║ ║ Test2 ║ 3 ║ 2.4 ║ ║ Test3 ║ 1 ║ PASS ║ ║ Test3 ║ 2 ║ PASS ║ ╚═══════════╩══════╩═══════╝</code>
必要な出力は、次のようなピボット テーブルです:
<code>╔══════════════════════════╗ ║ SBNO Test1 Test2 Test3 ║ ╠══════════════════════════╣ ║ 1 0.304 2.3 PASS ║ ║ 2 0.31 2.5 PASS ║ ║ 3 0.306 2.4 NULL ║ ╚══════════════════════════╝</code>
集約関数を使用しない動的ピボット
集計関数を使用せずにこの結果を達成するには、PIVOT 関数を利用できます。 VAL 列には varchar データが含まれているため、MAX 集計関数を利用できます。
ハードコードされたパースペクティブ
限られた数のテストでは、次のように列名をハードコーディングできます:
<code class="language-sql">select sbno, Test1, Test2, Test3 from ( select test_name, sbno, val from yourtable ) d pivot ( max(val) for test_name in (Test1, Test2, Test3) ) piv;</code>
スケーラブルな動的視点
大規模なテストの場合、動的 SQL はスケーラブルなソリューションを提供します。
<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT sbno,' + @cols + ' from ( select test_name, sbno, val from yourtable ) x pivot ( max(val) for test_name in (' + @cols + ') ) p ' execute(@query)</code>
どちらの方法でも、同じ目的の出力が生成されます。この例では、動的 SQL を活用して、複雑なデータ処理タスクを解決する柔軟で効率的なソリューションを作成する方法を示します。
以上が集計を行わずに SQL で動的ピボットを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。