首页 > 数据库 > mysql教程 > 如何在 SQL 中动态地将行转换为列而不进行聚合?

如何在 SQL 中动态地将行转换为列而不进行聚合?

Patricia Arquette
发布: 2025-01-08 00:51:42
原创
149 人浏览过

此 SQL 代码动态地将行转换为列,而不会丢失数据类型,这通常需要聚合函数。让我们重新表述一下,以使其更加清晰并提高可读性。

How to Dynamically Pivot Rows to Columns in SQL Without Aggregation?

在 SQL 中动态地将行转换为列:类型保留解决方案

标准 SQL PIVOT 操作通常需要聚合函数(如 MAXMIN),这可能会导致数据丢失或类型强制。此示例演示了一种动态 SQL 方法,可将行转换为列,同时保留原始数据类型,最多处理 12 个测试名称。

挑战在于将具有可变数量的测试名称(最多 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中文网其他相关文章!

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