除了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')
在上面添加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'
不会被复制
@TimBiegeleisen - 谢谢:) –
或者用丑陋的硬编码子查询的,但它是简单
SELECT
(SELECT hValue FROM Options WHERE sType = 'Late') AS Late,
(SELECT hValue FROM Options WHERE sType = 'NSF') AS NSF
长时间工作的表格最多只有最后一行和一个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
您可能需要修改查询略有我假设的数据类型。
如果您需要进一步加入输出,可以将其转储到临时表中。
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多余的独特价值,但它并非总是如此。
它是什么数据库系统? – Szymon