2014-09-29 2 views
1

У меня есть такое заявление:Dynamic Заказывайте Пункт включая Рассчитано колонок не работает

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» не работает в пункте OrderBy. Я не получаю никаких ошибок из моего кода SQL, но он просто не упорядочивает вычисляемый столбец «Поставки», когда я устанавливаю параметр @OrderBy в «Поставки».

Если удалить динамический порядок по п, то он работает отлично, как это:

.... 
ORDER BY 
    'Deliveries' DESC; 

Как я могу заставить его работать в динамической версии?

ответ

1

да имя псевдонима не может быть доступно в порядке, вы можете использовать КТР и получить имя вычисляемого столбца или вам нужно повторить весь расчет в порядке также

;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

Является ли это эффективное способ сделать это? Я спрашиваю, потому что сотни пользователей будут сортировать свои результаты одновременно. –

+0

@volume one, да, это должно быть масштабируемым, другой подход - это вычисленное значение результата результата и id в таблице temp, соединение с временной таблицей и использование столбца таблицы temp в порядке – radar

 Смежные вопросы

  • Нет связанных вопросов^_^