使用SQL按个别排序

时间:2014-05-21 09:09:32

标签: sql ms-access

我有下表:

+----+----------+-----+-----------+----------+
| 1 | Ramesh   | 32 | Ahmedabad | 2000.00 |
| 7 | Muffy    | 24 | Indore    | 10000.00 |
| 6 | Komal    | 22 | MP       | 4500.00 |
| 2 | Khilan   | 25 | Delhi     | 1500.00 |
| 3 | kaushik  | 23 | Kota      | 2000.00 |
| 5 | Hardik   | 27 | Bhopal    | 8500.00 |
| 4 | Chaitali | 25 | Mumbai    | 6500.00 |
+----+----------+-----+-----------+----------+

并且,我使用以下查询按照我的首选顺序对表进行排序,但是我收到以下SQL错误:

  

CURSOR OPERATION CONFLICT

我的查询:

SELECT * FROM CUSTOMERS ORDER BY (CASE ADDRESS WHEN 'DELHI'   THEN 1
WHEN 'BHOPAL'   THEN 2
WHEN 'KOTA'   THEN 3
WHEN 'AHMADABAD' THEN 4
WHEN 'MP'  THEN 5
ELSE 100 END) ASC, ADDRESS DESC

3 个答案:

答案 0 :(得分:3)

由于Access不支持CASE ... WHEN,您有两种方法可以获得自定义排序顺序。

1)如果可以编辑数据库结构,请在表中添加“SortOrder”列。

假设“地址”字段在“CUSTOMERS”表中具有唯一值,则在“CUSTOMERS”表中创建一个名为“SortOrder”的字段,为“Delhi”指定“1”,为“Bhopal”指定“2”,等等:

SELECT *
FROM CUSTOMERS
ORDER BY CUSTOMERS.SortOrder DESC;

但是,如果可能在“CUSTOMERS”表中多次出现相同的“Address”值,则应创建一个新的表,如“ADDRESSES”,其中包含Address和SortOrder值.SQL最终会看起来像这样:

SELECT CUSTOMERS.* 
FROM CUSTOMERS INNER JOIN ADDRESSES ON CUSTOMERS.Address = ADDRESSES.Address 
ORDER BY ADDRESSES.SortOrder DESC;

2)或者,如果您不能使用ORDER BY子句中的IIf()函数编辑数据库结构:

SELECT *
FROM CUSTOMERS
ORDER BY IIf([ADDRESS] = 'DELHI',1,IIf([ADDRESS] = 'BHOPAL',2,
IIf([ADDRESS] = 'KOTA',3,IIf([ADDRESS] = 'AHMADABAD',4,
IIf([ADDRESS] = 'MP',5,6))))) DESC;

除非您无法编辑数据库结构,否则应避免执行此操作,因为函数调用很慢,尤其是在此示例中评估多个条件时。如果您需要为“ADDRESS”字段指定任何其他排序,则需要添加其他IIf()函数,这将进一步降低速度。

如果您能够为“ADDRESS”的每个值指定排序顺序,则应使用单个Switch()函数而不是嵌套的IIf()函数。

答案 1 :(得分:3)

Access中不存在

CASE。您可以改为使用Switch()

答案 2 :(得分:-2)

Please Click Here for a Demo

请访问以上链接,您将获得解决方案