ホームページ > データベース > mysql チュートリアル > SQL Server で行を列に効率的に転置するにはどうすればよいですか?

SQL Server で行を列に効率的に転置するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-05 00:25:42
オリジナル
172 人が閲覧しました

How Can I Efficiently Transpose Rows to Columns in SQL Server?

SQL Server で行を列に転置する

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.

PIVOT

もう 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

列の数が固定されておらず、固定でなければならない場合動的に決定される場合は、動的 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 サイトの他の関連記事を参照してください。

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