ホームページ > データベース > mysql チュートリアル > 集計を行わずに SQL で動的ピボットを実行するにはどうすればよいですか?

集計を行わずに SQL で動的ピボットを実行するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-07 22:51:44
オリジナル
936 人が閲覧しました

How to Perform Dynamic Pivoting in SQL Without Aggregation?

動的ピボット: 行を列に巧みに変換します

動的 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート