无需聚合函数的 SQL 行转列操作
在数据处理中,将行数据转换为列数据(行转列)是一种常见的需求,这对于基于多个属性的汇总或分析数据特别有用。
SQL 中的 PIVOT 函数可以实现行转列操作。然而,PIVOT 函数通常需要结合聚合函数(如 MAX 或 MIN)来处理透视后的值。但在某些情况下,我们希望进行简单的值透视,而无需任何聚合操作。
例如,考虑一个名为 "TEST" 的表,包含以下列:
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中文网其他相关文章!