この SQL コードは、データ型を失うことなく行を列に動的にピボットします。これには、多くの場合、集計関数が必要です。わかりやすくし、読みやすくするために、言い換えてみましょう。

SQL で行を列に動的にピボットする: 型保持ソリューション
標準 SQL PIVOT 操作は通常、集計関数 (MAX や MIN など) を必要とするため、データ損失や型強制が発生する可能性があります。この例では、元のデータ型を維持しながら行を列にピボットし、最大 12 個のテスト名を処理する動的 SQL アプローチを示します。
課題は、可変数のテスト名 (最大 12) と混合データ型を含むテーブルを、各テスト名が列になるテーブルに変換することにあります。 この変動に対応するには、動的なソリューションが必要です。
動的 SQL ソリューション
このソリューションは、動的 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>コードはまず、一意の @cols 値から列名のカンマ区切りリスト (TEST_NAME) を作成します。 次に、PIVOT を集計関数として使用して、@query クエリ (MAX(val)) を構築します。 MAX が使用されている間、各 SBNO 内の一意の値に基づいてピボットしているため、元のデータが効果的に保存されます。 最後に、生成されたクエリが実行されます。
出力例
出力テーブルには、一意のテスト名ごとに列があり、元のテーブルの対応する値が入力され、元のデータ型が維持されます。
<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 での動的なピボットのための堅牢なソリューションを提供します。 yourtable をテーブルの実際の名前に置き換えることを忘れないでください。
以上が集計を行わずに SQL で行を列に動的にピボットする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。