首页 > 数据库 > mysql教程 > 如何动态透视具有不同类别的 SQL Server 表?

如何动态透视具有不同类别的 SQL Server 表?

DDD
发布: 2025-01-25 18:47:11
原创
544 人浏览过

How to Dynamically Pivot a SQL Server Table with Varying Categories?

使用动态 SQL 实现数据透视

问题:

将包含日期、类别和金额列的数据集转换为具有动态类别的透视表。例如,以下数据:

<code>日期        类别        金额
2012年1月1日    ABC             1000.00
2012年2月1日    DEF             500.00
2012年2月1日    GHI             800.00
2012年2月10日   DEF             700.00
2012年3月1日    ABC             1100.00</code>
登录后复制

需要转换为:

<code>日期        ABC             DEF             GHI
2012年1月1日    1000.00
2012年2月1日                    500.00        800.00
2012年2月10日                   700.00
2012年3月1日    1100.00</code>
登录后复制

解决方案:

SQL Server 提供了动态透视功能,可以用来实现这种转换。以下脚本演示了如何实现:

<code class="language-sql">CREATE TABLE temp (
    date DATETIME,
    category VARCHAR(3),
    amount MONEY
);

INSERT INTO temp VALUES ('2012-01-01', 'ABC', 1000.00);
INSERT INTO temp VALUES ('2012-02-01', 'DEF', 500.00);
INSERT INTO temp VALUES ('2012-02-01', 'GHI', 800.00);
INSERT INTO temp VALUES ('2012-02-10', 'DEF', 700.00);
INSERT INTO temp VALUES ('2012-03-01', 'ABC', 1100.00);


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');

SET @query = 'SELECT date, ' + @cols + ' FROM 
            (
                SELECT date, amount, category
                FROM temp
           ) x
            PIVOT 
            (
                 MAX(amount)
                FOR category IN (' + @cols + ')
            ) p ';


EXECUTE(@query);

DROP TABLE temp;</code>
登录后复制

此方法使用动态 SQL 从表中检索不同的类别。然后,它动态地构造 PIVOT 子句,考虑所有唯一的类别。然后相应地透视结果,按日期和类别对齐数据。

结果:

<code>日期                        ABC         DEF    GHI
2012-01-01 00:00:00.000     1000.00     NULL    NULL
2012-02-01 00:00:00.000     NULL        500.00  800.00
2012-02-10 00:00:00.000     NULL        700.00  NULL
2012-03-01 00:00:00.000     1100.00     NULL    NULL</code>
登录后复制

以上是如何动态透视具有不同类别的 SQL Server 表?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板