gpt4 book ai didi

sql - 将行旋转到没有聚合的列

转载 作者:行者123 更新时间:2023-12-03 12:35:06 24 4
gpt4 key购买 nike

试图弄清楚如何编写动态数据透视 sql 语句。哪里TEST_NAME最多可以有 12 个不同的值(因此有 12 列)。某些 VAL 将是 Int、Decimal 或 Varchar 数据类型。我见过的大多数例子都包含了一些来自聚合的。我正在寻找一个直接的值(value)支点。

Source Table 

╔═══════════╦══════╦═══════╗
║ 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 ║
╚═══════════╩══════╩═══════╝


Desired Output
╔══════════════════════════╗
║ SBNO Test1 Test2 Test3 ║
╠══════════════════════════╣
║ 1 0.304 2.3 PASS ║
║ 2 0.31 2.5 PASS ║
║ 3 0.306 2.4 NULL ║
╚══════════════════════════╝

最佳答案

PIVOT函数需要聚合才能使其工作。看来您的 VAL列是 varchar所以你必须使用 MAXMIN聚合函数。

如果测试数量有限,那么您可以对这些值进行硬编码:

select sbno, Test1, Test2, Test3
from
(
select test_name, sbno, val
from yourtable
) d
pivot
(
max(val)
for test_name in (Test1, Test2, Test3)
) piv;

SQL Fiddle with Demo .

在您的 OP 中,您表示您将有更多的行变成列。如果是这种情况,那么您可以使用动态 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)

SQL Fiddle with Demo .

两个版本都会给出相同的结果:
| SBNO | TEST1 | TEST2 |  TEST3 |
---------------------------------
| 1 | 0.304 | 2.3 | PASS |
| 2 | 0.31 | 2.5 | PASS |
| 3 | 0.306 | 2.4 | (null) |

关于sql - 将行旋转到没有聚合的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15674373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com