除了PIVOT之外,还有其他的方法吗?

问题描述:

我这里有这个表,除了PIVOT之外,还有其他的方法吗?

选项

ID  sType hValue 
1  Late 10 
2  NSF  20 

现在我想的是,一个单一的查询来获取输出象下面这样:

Late NSF 
10 20 

2与单独的列他们各自的h值(单行)。并且应该有单独的列名,以便我可以使用此查询与其他一些数据进行连接。

我试过了病例陈述但显然它不工作。它给了我2个独立的行,每列有1个NULL值。

select Case when sType = 'Late' Then hValue End late, 
Case When sType='NSF' Then hValue End nsf 
from Options 
where sType IN ('Late', 'NSF') 
+1

它是什么数据库系统? – Szymon

在上面添加Max总您case声明

SELECT MAX(CASE WHEN sType = 'Late' THEN hValue END) late, 
     MAX(CASE WHEN sType = 'NSF' THEN hValue END) nsf 
FROM Options 
WHERE sType IN ('Late', 'NSF') 

考虑到您的'Late''NSF'不会被复制

+0

@TimBiegeleisen - 谢谢:) –

或者用丑陋的硬编码子查询的,但它是简单

SELECT 
    (SELECT hValue FROM Options WHERE sType = 'Late') AS Late, 
    (SELECT hValue FROM Options WHERE sType = 'NSF') AS NSF 
+0

长时间工作的表格最多只有最后一行和一个NSF行。 – jarlh

如果这是SQL Server,则可以使用动态查询。对于超过2条记录,这将工作得很好,并且没有值被硬编码。

declare @sql as nvarchar(max) = N'select ' 
select @sql = @sql + cast(hValue as nvarchar(50)) + ' as ' + '''' + sType + ''', ' 
from Options 

if len(@sql) > 2 
    set @sql = left(@sql, len(@sql) - 1) 

exec sp_executesql @sql 

SQL Fiddle

您可能需要修改查询略有我假设的数据类型。

如果您需要进一步加入输出,可以将其转储到临时表中。

PIVOT只是一些其他SQL语句的快捷方式。在大多数情况下,PIVOT声明

-- Copied from T-SQL 2012 Fundamental. 
SELECT ... 
FROM <source_table_or_table_expression> 
PIVOT(<agg_func>(<aggregation_element>) 
FOR <spreading_element> 
IN (<list_of_target_columns>)) AS <result_table_alias>; 

它可以转换为

SELECT pass_through_columns, 
    <agg_func>(CASE WHEN <spreading_element> = '<target_columns1>' WHEN aggregation_element END) AS target_column1, 
    <agg_func>(CASE WHEN <spreading_element> = '<target_columns2>' WHEN aggregation_element END) AS target_column2, 
    ... 
FROM <source_table_or_table_expression> 
GROUP BY pass_through_columns; 

没有聚合函数你不能谈论PIVOT。在你的情况下,尝试

select MAX(Case when sType = 'Late' Then hValue End) AS late, 
MAX(Case When sType='NSF' Then hValue End) nsf 
from Options 
where sType IN ('Late', 'NSF') 

有可能是每个spreading_element(晚,NSF),这使得MAX多余的独特价值,但它并非总是如此。