【发布时间】:2021-06-21 15:50:42
【问题描述】:
假设我有看起来像这样的数据:
Table
Num1 Type1 Code Group DA Account Value
1X2 GG XX1 INTS 1 123 75.00
1X2 GG XX1 INTS 1 234 100.00
我要做的是透视数据,使其看起来像这样:
Num1 Type1 Code Group DA 123 234
1X2 GG XX1 INTS 1 75.00 100.00
我不太确定如何使用 PIVOT 完成这样的事情,但我确实尝试了以下方法:
Select Num1,
Type1,
Code,
Group,
DA,
'123' = (Select Value from Table t2 where t1.num1 = t2.num1 and Account = 123 ),
'234' = (Select Value from Table t2 where t1.num1 = t2.num1 and Account = 234 )
From Table t1
但是我得到的错误是:Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
在这种情况下,我在每个子查询中添加了“Top 1”:
Select Num1,
Type1,
Code,
Group,
DA,
'123' = (Select TOP 1 Value from Table t2 where t1.num1 = t2.num1 and Account = 123 ),
'234' = (Select TOP 1 Value from Table t2 where t1.num1 = t2.num1 and Account = 234 )
From Table t1
然而,即使查询现在为每个帐户返回两行 AMOUNTS,我还没有完全理解 TOP 1 的目的,但基本上现在数据看起来像这样:
Num1 Type1 Code Group DA 123 234
1X2 GG XX1 INTS 1 NULL 100.00
1X2 GG XX1 INTS 1 75.00 NULL
我想这还不错,因为我可以在所有其他列上使用GROUP BY 执行MAX(123) 和MAX(234),最后得到1 行。
有没有更好的方法来解决这个问题?这可以通过 PIVOT 实现吗?
【问题讨论】:
-
注意:语法
'Literal String Alias' = {Expression}已被弃用,不应使用不。然而,理想情况下,无论如何都要避免使用文字字符串作为别名;对于刚接触这门语言的人来说,这可能会让人很困惑。 -
@Larnu - 是的,SSMS 正在为这个向我咆哮。更多的是概念证明,但如果我坚持这种方式,我会将 {Expression} 设为 '123'
-
不,请
AS [123]或AS "123"。 -
@Larnu - 明白了,谢谢!
-
我很好奇你问如何使用 PIVOT 来做到这一点,我回答使用 PIVOT,你接受了答案,然后几天后你换了一个不使用 PIVOT 的答案。
标签: sql-server ssms pivot