2015-12-15 5 views
0

У меня есть эта таблица здесь,Есть ли альтернатива этому, кроме PIVOT?

Опции

ID  sType hValue 
1  Late 10 
2  NSF  20 

Теперь я хочу, один запрос, чтобы получить выход, как показано ниже:

Late NSF 
10 20 

2 отдельных колонн с их соответствующие hValues ​​(в одной строке). И должны иметь отдельные имена столбцов, чтобы я мог использовать этот запрос для соединения с некоторыми другими данными.

Я пробовал Деловые заявления Но, очевидно, он не работает. Он дает мне 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

ответ

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' не будет дублироваться

+0

@TimBiegeleisen - Спасибо :) –

0

Или используя уродливое жестко подзапрос, но это просто

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

Работает так долго, что таблица имеет только макс один конец строки и одну строку NSF. – jarlh

0

Если это SQL Server, вы можете использовать динамический запрос. Это будет хорошо работать с более чем двумя записями, и никакие значения не будут жестко закодированы.

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

Вы, возможно, потребуется немного модифицировал запрос, как я предполагал, типы данных.

Если вам нужно дополнительно присоединиться к выходу, вы можете сбросить его в таблицу темп.

0

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 (Late, NSF), что делает MAX излишним, но это не всегда так.

Смежные вопросы