2014-09-29 67 views
1

我有这样的语句:动态ORDER BY子句包括计算列不起作用

DECLARE @OrderBy nvarchar(50) 
SELECT 
    t1.Forename, 
    t1.Surname, 
/** Calculcated Column Start **/ 
    (
    SELECT 
     (
     SELECT Count(FulfilledDelivery) FROM dbo.Deliveries d1 WHERE d1.UserID = t1.UserID 
    ) 
     - 
     (
     SELECT Count(CancelledDelivery) FROM dbo.Deliveries d1 WHERE d1.UserID = t1.UserID 
    ) 
    ) AS 'Deliveries' 
/** Calculcated Column End **/ 

FROM 
    TableName t1 
WHERE 
ORDER BY 
    CASE WHEN @OrderBy = 'Deliveries' THEN 'Deliveries' END DESC, 
    CASE WHEN @OrderBy = 'Forename' THEN t1.Forename END DESC, 
    CASE WHEN @OrderBy = 'Surname' THEN t1.Surname END DESC 
    END; 

基本上,这工作得很好,除了计算列“Deliveries”的排序依据子句中不起作用。我没有从我的SQL代码中得到任何错误,但是当我将@OrderBy参数设置为“Deliveries”时,它并没有通过calculcated列'Deliveries'排序。

如果我一条一条地删除动态订单,然后正常工作是这样的:

.... 
ORDER BY 
    'Deliveries' DESC; 

我怎样才能使它在动态版的工作?

回答

1

是别名不能在ORDER BY访问,您可以使用CTE和计算列得到名字或你需要还

;WITH CTE T 
as 
(
SELECT 
    t1.Forename, 
    t1.Surname, 
/** Calculcated Column Start **/ 
    (
    SELECT 
     (
     SELECT Count(FulfilledDelivery) FROM dbo.Deliveries d1 WHERE d1.UserID = t1.UserID 
    ) 
     - 
     (
     SELECT Count(CancelledDelivery) FROM dbo.Deliveries d1 WHERE d1.UserID = t1.UserID 
    ) 
    ) AS 'Deliveries' 
/** Calculcated Column End **/ 

FROM 
    TableName t1 
) 
SELECT * FROM T 
ORDER BY 
    CASE WHEN @OrderBy = 'Deliveries' THEN T.Deliveries END DESC, 
    CASE WHEN @OrderBy = 'Forename' THEN T.Forename END DESC, 
    CASE WHEN @OrderBy = 'Surname' THEN T.Surname END DESC 
    END; 
+0

重复整个计算,以便这是一个有效的如何做到这一点?我问,因为数百名用户将同时对他们的结果进行排序。 – 2014-09-30 11:04:50

+0

@volume one,是的,这应该是可伸缩的,另一种方法是把计算结果值和id放在临时表中,然后用临时表连接并按顺序使用临时表列 – radar 2014-09-30 11:46:45