2017-04-15 96 views
-1

我有以下与以下相关columns- Invoices-SQL查询排序

Invoice Number | Invoice Date | Invoice Status 

发票状态可以有值表:待定,SENT,快递,LR,取消,DONE

我要订购 发票超过2天但没有状态CANCELED和DONE应该先出现 然后 发票更新,然后2天但没有状态CANCELED和DONE应该先出现 然后 所有已取消或已完成的发票都应该列在最后 如何在SQL中实现此目的。

我正在使用SQL服务器和写存储过程是我不热衷做它。

理想情况下,它应该是单个SQL语句。

这个问题的解决方案是什么?

+0

“我正在使用SQL服务器,编写存储过程是我不想做的事情” - 动机是#1解决方案! –

+0

请研究'UNION'条款。我将准备一个基于它的答案来说明它的用法。 – toonice

+0

欢迎来到StackOverflow。请花一些时间并访问[帮助中心](http://stackoverflow.com/help/)习惯网站。你试过什么了? – Spidey

回答

1

您在order by做到这一点使用表达式:

select i. 
from invoices i 
order by (case when invoicedate < dateadd(day, -2, getdate()) and 
        status not in ('Cancelled', 'Done') 
       then 1 
       when status not in ('Cancelled', 'Done') 
       then 2 
       then 3 
      end); 

存储过程是没有必要为这个(也不在我看来是可取的)。

+1

我总是弄糊涂​​使用嵌套查询,但我一直关注你和你在这个网站上提供的答案。老实说,我从你身上学到了很多东西,而不是在学校呆了4年。谢谢 ... –

0

请尝试以下...

SELECT [Invoice Number], 
     [Invoice Date], 
     [Invoice Status] 
FROM Invoices 
WHERE [Invoice Status] NOT IN ('CANCELLED', 'DONE') 
    AND DATEADD(DAY, -2, GETDATE()) > [Invoice Date] 
UNION 
SELECT [Invoice Number], 
     [Invoice Date], 
     [Invoice Status] 
FROM Invoices 
WHERE [Invoice Status] NOT IN ('CANCELLED', 'DONE') 
    AND DATEADD(DAY, -2, GETDATE()) <= [Invoice Date] 
UNION 
SELECT [Invoice Number], 
     [Invoice Date], 
     [Invoice Status] 
FROM Invoices 
WHERE [Invoice Status] IN ('CANCELLED', 'DONE'); 

在每个由SELECT声明我选择显示所有字段,并以相同的顺序。请注意,构成UNIONSELECT语句中的相应字段应始终具有相同的类型。在某些情况下,一种类型的字段可能会转换为与另一种类型匹配,但这有时会导致麻烦,强烈建议您尝试避免出现这种情况。

在我的第一个声明中,我将当前日期前两天的日期与[Invoice Date]进行比较,如果它更大(即发票超过2天),则包含该行(视其[Invoice Status]而定)。

对于第二种说法,我选择日期不超过当前日期前两天的发票。

对于第三种说法,我显示状态为CANCELLEDDONE的所有发票。

您可以在每个列表中指定相似或不同模式的排序,分组等,但由于您没有在您的问题中指定任何此类信息,我并未尝试实施它们。

如果您有任何问题或意见,请随时发布相应评论。