除了PIVOT之外还有其他选择吗?

时间:2015-12-15 05:30:30

标签: sql

我在这里有这张表,

选项

ID      sType   hValue
1       Late    10
2       NSF     20

现在我想要的是,获得如下输出的单个查询:

Late  NSF
10    20

2个单独的列及其各自的hValues(在一行中)。并且应该有单独的列名,以便我可以使用此查询来加入其他一些数据。

我已经尝试了Case语句但显然它不起作用。它给了我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')

4 个答案:

答案 0 :(得分:2)

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'不会重复

答案 1 :(得分:1)

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')

每个spread_element(Late,NSF)可能有不同的值,这使MAX变得多余,但情况并非总是如此。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果这是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

您可能需要稍微修改查询,因为我假设数据类型。

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