我在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
表格:
部门:包含具有以下列的部门列表:
- DeptId int
- 描述varchar(50(
DeptOrder:列出公司各部门的订单,并具有以下列:
- DeptId int
- 订单int(它是一个相关的数字(
我要做的事情:如果@OrderByDescription=1,我想获得一个部门列表及其描述顺序。否则,如果@OrderByDescription=0,我想获得按顺序排序的列表字段(末尾会放null(。
所以假设下面的例子。
案例1:Department表中的某些部门不在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错误。
您得到了o。订单有点错位-它需要在初始case语句结束后:
ORDER BY
CASE WHEN OrderByDescription = 1
THEN [Description]
ELSE CASE WHEN o.[Order] IS NULL
THEN '1'
ELSE '0'
END
END
,o.[Order]