我在这里有这张表,
选项
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')
答案 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
您可能需要稍微修改查询,因为我假设数据类型。
如果需要进一步加入输出,可以将其转储到临时表中。