sql - 我们如何在不使用聚合函数的情况下进行透视?

标签 sql sql-server-2008 pivot

我想在没有 sql 聚合函数的情况下进行数据透视。 这里使用了“max”聚合函数,但是当我删除聚合函数时,会显示语法错误。当我使用“max”聚合函数时,仅显示字符串值中的最大字符串,而当使用“min”聚合函数时,则显示字符串中的最小字符串值。我需要最小值和最大值,以及“FieldSubValues”中的所有字符串值。

我需要在不使用聚合函数的情况下进行旋转。谁能帮帮我。

SELECT   *  
FROM
(
     SELECT FieldSubName,FieldSubValues 
    FROM FormFieldValue where FieldID=182 
)as p    
PIVOT 
( 
    min(FieldSubValues) 
    FOR FieldSubName IN ([Name],[Gender],[Days],[Message]) 
) AS pvt

这里我想要“消息”值,即“测试”和“fsdfds” enter image description here

最佳答案

如果您同时需要 Min()Max() 字符串值,则只需使用 UNIONPIVOT 两次。

select *
from 
(
  select FieldSubName, FieldSubValues
  from FormFieldValue
) x
PIVOT
(
  min(FieldSubValues)
  for FieldSubName IN ([Name], [Gender], [Days], [Message])
) p
UNION
select *
from 
(
  select FieldSubName, FieldSubValues
  from FormFieldValue
) x
PIVOT
(
  max(FieldSubValues)
  for FieldSubName IN ([Name], [Gender], [Days], [Message])
) p

参见SQL Fiddle with Demo .

如果您想要所有值而不仅仅是 max/min 值,那么您可以向子查询添加 row_number() 。通过添加行号,您可以通过 FieldName 对数据进行分区,这将允许您旋转多行 - 而不仅仅是最大值和最小值:

select [Name], [Gender], [Days], [Message]
from 
(
  select FieldSubName, FieldSubValues,
    row_number() over(partition by FieldName order by FieldId) seq
  from FormFieldValue
) x
PIVOT
(
  max(FieldSubValues)
  for FieldSubName IN ([Name], [Gender], [Days], [Message])
) p;

参见SQL Fiddle with Demo

关于sql - 我们如何在不使用聚合函数的情况下进行透视?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11226341/

相关文章:

mysql - 如何查询Mysql特定列中相同id具有不同值的位置

sql - 仅当当前值大于先前值时 MSSQL 才会更新

excel - BCP queryout -w 生成错误的 CSV 文件

SQL Server SELECT 最后 N 行

c# - C# Entity Framework 3.5 中的透视

sql - AWS Redshift 身份列插入 - 新记录的身份值不大于以前的最大身份值

sql - 通过从不同列中选择随机值来更新列

mysql - 是什么让 `EXPLAIN` 中的行很少的查询变慢?

python - 尝试在 DataFrame.pivot 中使用多索引时出现 ValueError

python - 如何检查所有值是否都在pivot_table的输入DataFrame中,并创建一些Python Pandas中不存在的值并用0填充?