2011-12-21 123 views
0

我在如何排序下面的联合查询的第二个选择语句中的数据丢失。与联盟和空值排序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 2011-12-21 15:52:57

+0

O_o好的,这是我以前想过的*以前我曾尝试过,并且出现语法错误,尽管它现在工作完美:)感谢您的帮助! ...我想这只是其中的一个...... – ChandlerPelhams 2011-12-21 15:56:49

0

ORDER BY之后UNION ALL或其他集合运算符来计算。因此,您应该在这些子选择语句上使用子查询运行ORDER BY,计算分配增加的行号的伪列,然后按外部语句中伪列的值排序。

+0

@Lucero:没有'ORDER BY'的RDBMS是免费的输出以任意顺序排。 'UNION ALL'合并两组,不过滤掉重复的行,但从技术上讲,不能保证你的子集一个接一个出来。 – Benoit 2011-12-21 15:51:59