【问题标题】:SQL Server Pivot on string data?SQL Server Pivot 字符串数据?
【发布时间】:2022-01-02 08:56:29
【问题描述】:

我有一张这样的桌子:

我想将表结构更改为这种格式:

我使用了这个查询:

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([Q]) Frommytable  Order by 1 For XML Path('')),1,1,'') 
Select  @SQL = 'Select [user],' + @SQL + '
From mytablle
 Pivot ( sum(Answer) For [Q] in (' + @SQL + ') ) p'

Exec(@SQL);

但它不起作用,因为我们不能对 [Answer] 使用 sum 函数(它是字符串)。 你对这个问题的指导是什么?

【问题讨论】:

  • 好吧,如果它是一个字符串,那么你想要什么聚合?也许MAX?您使用的是哪个版本的 SQL Server?
  • 请避免发布images的数据,我们无法从图像中剪切和粘贴,示例数据在您的问题中应该是consumable text,最好是create 和 insert 语句,或者DB<>Fiddle
  • 是的。使用 MINMAX 函数应该可以解决问题。
  • 这能回答你的问题吗? SQL Server - PIVOT on CASE statement
  • 我的数据是字符串!最小值或最大值不适用于它。我只想要数据。我的问题类似于 SQL Server - PIVOT on CASE 语句,但我的数据不是数字,所以我们不能使用数值函数

标签: sql-server tsql pivot-table unpivot


【解决方案1】:

您可以使用枢轴和前导函数来获得结果。

在这里查看以供参考:

Microsoft Docs - Lead function

Microsoft Docs - Pivot

这里有两个例子:

select 
    [user],
    max([x]) [x],
    max([y]) [y],
    max([z]) [z]
from tbl
pivot (max(answer) for q in ([x],[y],[z])) p
group by [user]

-- Result
/*
+------+---+---+---+
| user | x | y | z |
+------+---+---+---+
| i1   | 1 | 2 | 5 |
| i2   | 0 | 4 | 5 |
| i3   | 1 | 4 | 6 |
+------+---+---+---+
*/
with t as (
    select 
    [user],
    [x],
    Lead([y],1) over(partition by [user] order by [id]) [y],
    Lead([z],2) over(partition by [user] order by [id]) [z]
    from tbl
    pivot (max(answer) for q in ([x],[y],[z])) p
)
select * from t
where [x] is not null

-- Result
/*
+------+---+---+---+
| user | x | y | z |
+------+---+---+---+
| i1   | 1 | 2 | 5 |
| i2   | 0 | 4 | 5 |
| i3   | 1 | 4 | 6 |
+------+---+---+---+
*/

注意:此查询使用 id 对前导函数中的行进行排序。

【讨论】:

  • 非常感谢。第一个代码没有任何错误,但显示所有单元格“Null”。我不知道是什么问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多