2016-10-28 55 views
0

我正在使用SQL Server数据库,并选择记录以显示合同信息。该协议可以是活动的,不活动的,等待响应或等待付款。ORDER BY查询抛出错误

我的用户希望网格显示顺序的结果:

  • 等待回复
  • 等待付款
  • 逾期
  • 活动
  • 无效

我试图使用下面的代码来实现这一目标,但它很糟糕ws错误说在单词默认附近的语法错误。

通过声明的顺序有什么问题?

Try 
    sql = "SELECT ContractID, CustAcc, DateStart, DateRenew, Fee, Agreement, OtherDetails, " _ 
     & "DateSent, TimeSent, ReminderName, ReminderEmail FROM dbo.tblContracts " _ 
     & "ORDER BY FIELD(Agreement, 'AWAITING RESPONSE', 'AWAITING PAYMENT', 'ACTIVE', 'INACTIVE')" 
    conAd = New OleDb.OleDbDataAdapter(sql, con) 
    conset = New DataSet 
    conAd.Fill(conset) 
    ugModules.DataSource = conset 
Catch ex As Exception 
    errorLog(ex.Message, ex.StackTrace) 
    MsgBox("Failed to retrieve contract information, refer to error log") 
End Try 

编辑

改变我的代码按从@Solarflare的建议后,我现在已经得到了下面的代码;

sql = "SELECT ContractID, CustAcc, DateStart, DateRenew, Fee, Agreement, OtherDetails, " _ 
& "DateSent, TimeSent, ReminderName, ReminderEmail FROM dbo.tblContracts " _ 
& "ORDER BY CASE Agreement WHEN 'AWAITING RESPONSE' THEN 1 WHEN 'AWAITING PAYMENT' THEN 2 " _ 
& "WHEN 'OVERDUE' THEN 3 WHEN 'ACTIVE' THEN 4 WHEN 'INACTIVE' THEN 5 END" 

但是,结果并不如预期。其结果如下

所以INACTIVE主要位于顶部,其次是AWAITING RESPONSE和INACTIVE等的混合 - 为什么会这样呢?

+0

什么类型的SQL? – Santi

+0

什么数据类型是'Agreement'?它看起来像你正试图将它(或什么)翻译成该文本?也。 “默认”是不是在SQL中,所以它不清楚错误实际上是从该片段 – Plutonix

+3

这看起来像你试图在mssql服务器上使用mysql函数。看看[什么是MS SQL Server功能类似于MySQL的FIELD()函数?](http://stackoverflow.com/questions/3892406/what-is-the-ms-sql-server-capability-similar mysql-field-function) – Solarflare

回答

0

ORDER BY应该在SQL Server中使用CASE语句。