首页 >数据库 >mysql教程 >如何在不聚合的情况下将 SQL 中的行转换为列?

如何在不聚合的情况下将 SQL 中的行转换为列?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-08 00:21:41772浏览

How to Pivot Rows to Columns in SQL Without Aggregation?

无需聚合函数的 SQL 行转列操作

在数据处理中,将行数据转换为列数据(行转列)是一种常见的需求,这对于基于多个属性的汇总或分析数据特别有用。

SQL 中的 PIVOT 函数可以实现行转列操作。然而,PIVOT 函数通常需要结合聚合函数(如 MAX 或 MIN)来处理透视后的值。但在某些情况下,我们希望进行简单的值透视,而无需任何聚合操作。

例如,考虑一个名为 "TEST" 的表,包含以下列:

  • TEST_NAME
  • SBNO
  • VAL

VAL 列包含各种数据类型(整数、小数或 varchar)。目标是将 TEST_NAME 列转换为三个单独的列(Test1、Test2 和 Test3),无需任何聚合:

<code>源表

╔═══════════╦══════╦═══════╗
║ TEST_NAME ║ SBNO ║  VAL  ║
╠═══════════╬══════╬═══════╣
║ Test1     ║    1 ║ 0.304 ║
║ Test1     ║    2 ║ 0.31  ║
║ Test1     ║    3 ║ 0.306 ║
║ Test2     ║    1 ║ 2.3   ║
║ Test2     ║    2 ║ 2.5   ║
║ Test2     ║    3 ║ 2.4   ║
║ Test3     ║    1 ║ PASS  ║
║ Test3     ║    2 ║ PASS  ║
╚═══════════╩══════╩═══════╝</code>
<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:

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

此查询生成一个动态 SQL 语句,其中包含 TEST_NAME 的所有唯一值作为列名。然后,它使用 PIVOT 函数将行数据转换为列,而无需应用任何聚合。

运行此 SQL 将产生所需的输出,即一个包含透视列 Test1、Test2 和 Test3 的表,其中包含来自原始表的相应 VAL 值。

This revised output maintains the original meaning while using slightly different wording and sentence structure. The technical details remain unchanged.

以上是如何在不聚合的情况下将 SQL 中的行转换为列?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn