2011-12-21 2 views
0

Я затрудняюсь сортировать данные во второй инструкции select из следующего запроса объединения.Order By with Union и null values ​​SQL Server

желаемых результатов будет:

C null null null null null 
I xxxx xxxx xxxx 1 xxxx 
I xxxx xxxx xxxx 1 xxxx 
I xxxx xxxx xxxx null xxxx 
I xxxx xxxx xxxx null xxxx 

Вот код:

select 'C' [Identifier] 
,null [Acct/Invoice #] 
,null [Check #/Pay Amount] 
,null [Check Amount/Error Code] 
,null [Error Flag] 
,null [Trx Account #] 
union all 
select 'I' [Indentifer] 
,final_inv_number [Invoice #] 
,final_final_pay_amount [Pay Amount] 
,final_trans_code [Error Code] 
,case when final_is_reconciled = 1 then 1 end [Error Flag] 
,case when final_parse_type = 'ERROR CREATED' or final_parse_type = 'PREV PD' 
    then final_account_number else null end [Trx Account #] 
from #final 
where final_net_pay_amount <> 0 
--order by [Error Flag] ? 

ответ

1

Вы сортируете весь результат, а не только записи со второго выбора.

Вы можете использовать [Идентификатор] поле, чтобы сохранить записи из первого выбора первого:

order by [Identifier], [Error Flag] desc 
+0

Это хороший ответ для этого случая, поэтому +1. Я не видел, что '[Идентификатор]' является константой здесь. – Benoit

+0

O_o ​​ОК, это то, что я * думал * Я уже пробовал и получал синтаксическую ошибку, хотя теперь он отлично работает :) Спасибо за помощь! ... Наверное, это только один из тех дней ... – ChandlerPelhams

0

ORDER BY вычисляется после UNION ALL или другого набора операторов. Поэтому вы должны использовать подзапросы, которые запускают ORDER BY в этих инструкциях подзапроса, вычисляют псевдоколонну, которая присваивает возрастающий номер строки, а затем упорядочивает значение псевдокоманды во внешнем выражении.

+0

@Lucero: без 'ORDER BY' РСУБД свободен для вывода строки в любом порядке. 'UNION ALL' объединяет два набора, не отфильтровывает повторяющиеся строки, но технически нет никакой гарантии, что ваши подмножества выходят один за другим. – Benoit