ホームページ >データベース >mysql チュートリアル >SQL Server でピボット列を動的に生成するにはどうすればよいですか?

SQL Server でピボット列を動的に生成するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-07 18:47:41563ブラウズ

How to Dynamically Generate Pivot Columns in SQL Server?

SQL Server の動的ピボット列

SQL Server では、動的ピボット列を使用して、別のテーブルの値に基づいて列が変更されるピボット テーブルを作成できます。これは、ピボット列の数が事前に不明な場合、または頻繁に変更される場合に便利です。

次の形式を考えてみましょう:

  • プロパティ: プロパティのリストが含まれます。
  • PropertyObjects: プロパティをオブジェクトにリンクし、プロパティの値を提供します。

問題の説明

プロパティ テーブルのプロパティごとに 1 つの列を含むピボット テーブルを作成したいと考えています。ただし、プロパティの数は変化する可能性があるため、列名を動的に取得する方法が必要です。

解決策

動的ピボット列を作成するには、PIVOT 句を指定した動的 SQL を使用できます。次のコードは 1 つの解決策を示しています:

<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

-- 获取作为逗号分隔字符串的唯一属性名称
SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(Name)
                      FROM property
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

-- 构造动态查询
SET @query =
'SELECT *
FROM
(
  SELECT
    o.object_id,
    p.Name,
    o.value
  FROM PropertyObjects AS o
  INNER JOIN property AS p ON o.Property_Id = p.Id
) AS t
PIVOT 
(
  MAX(value)
  FOR Name IN (' + @cols + ')
) AS p;';

-- 执行动态查询
EXEC(@query);</code>

結果

動的クエリは、Property テーブル内のプロパティごとに 1 つの列を含むピボット テーブルを返します。ピボット テーブルの値は、各属性とオブジェクトの組み合わせの最大値になります。

たとえば、Property テーブルに次のプロパティが含まれている場合:

  • プロパティ 1
  • プロパティ 2
  • プロパティ 3

およびPropertyObjectsテーブルには次のデータが含まれています:

OBJECT_ID PROPERTY_ID VALUE
1 1 ee
1 2 fd
1 3 fdf
1 4 ewre
2 1 dsd
2 2 sss
2 3 dfew
2 4 dff

動的クエリは次のピボット テーブルを返します:

OBJECT_ID PROPERTY1 PROPERTY2 PROPERTY3 PROPERTY4
1 ee fd fdf ewre
2 dsd sss dfew dff

以上がSQL Server でピボット列を動的に生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。