集計関数を使用しない SQL 行から列への操作
データ処理では、行データを列データ (行から列へ) に変換することが一般的に必要です。これは、複数の属性に基づいてデータを要約または分析する場合に特に役立ちます。
SQL の PIVOT 関数は、行から列への操作を実装できます。ただし、多くの場合、ピボットされた値を処理するには、PIVOT 関数を集計関数 (MAX や MIN など) と組み合わせる必要があります。ただし、場合によっては、集計操作を行わずに単純な値のピボットを実行したい場合があります。
たとえば、次の列を持つ「TEST」という名前のテーブルについて考えてみましょう:
VAL 列には、さまざまなデータ型 (整数、10 進数、または varchar) が含まれます。目標は、集計を行わずに TEST_NAME 列を 3 つの個別の列 (Test1、Test2、および Test3) に変換することです。
<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>
集計関数を使用せずにこれを実現するには、動的 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>
このクエリは、TEST_NAME の一意の値をすべて列名として含む動的 SQL ステートメントを生成します。次に、PIVOT 関数を使用して、集計を適用せずに行データを列に変換します。
この SQL を実行すると、目的の出力が生成されます。これは、元のテーブルの対応する VAL 値を含むピボット列 Test1、Test2、Test3 を持つテーブルです。
この改訂された出力は元の意味を維持していますが、若干異なる表現と文構造を使用しています。
以上が集計を行わずに SQL で行を列にピボットする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。