我在SQL Server 2008中有一个查询,并且尝试通过以下方式对其进行排序:
SELECT d.DeptId, Description
FROM Dept d LEFT JOIN DeptOrder o on p.DeptId = o.DeptId
WHERE d.DeptId IN (3, 7, 9, 10, 17, 20)
ORDER BY
CASE WHEN @OrderByDescription = 1 THEN Description
ELSE CASE WHEN o.Order IS NULL THEN 1 ELSE 0
END, o.Order
END
表格:
部门:包含具有以下列的部门列表:
DeptOrder:列出公司部门的订单,并具有以下列:
我正在尝试做的事情: 如果@OrderByDescription = 1,我想按描述获取按描述顺序排列的部门列表。否则,如果@OrderByDescription = 0,我想获取按订单字段排序的列表(空值将放在最后)。>
所以假设下面的例子。
情况1:“部门”表中的某些部门不在DeptOrder表中,并且@OrderByDescription = 0
Department
DeptId Description
1 Financial
2 Marketing
3 Communications
4 I+D
...
7 Accounting
以此类推
假设DeptOrder表仅包含以下部门(此表可能不包含某些部门。此处未列出的部门将放在列表的末尾):
DeptOrder
DeptId Order
7 1
3 2
获得的列表将是:
DeptId说明
7会计学
3通讯
然后其余订单按o.Order。
案例2 : Deptartment表中的部门不在DeptOrder表中,并且@OrderByDescription = 1
Department
DeptId Description
1 Financial
2 Marketing
4 Communications
5 I+D
8 Accounting
结果将是(按描述排序):
Department
DeptId Description
8 Accounting
4 Communications
1 Financial
5 I+D
2 Marketing
但是,在第二种情况的结尾处连接“,o.Order”时,出现了sql错误。
答案 0 :(得分:0)
您有o.Order稍微错位了-它需要在初始case语句关闭之后:
ORDER BY
CASE WHEN OrderByDescription = 1
THEN [Description]
ELSE CASE WHEN o.[Order] IS NULL
THEN '1'
ELSE '0'
END
END
,o.[Order]