2012-02-04 84 views
2

当我使用AVG或COUNT与SQL Server时,通过动态值进行排序时遇到问题。我怎样才能使它工作?ORDER BY CASE与子查询

ALTER PROCEDURE GetEmployee 
@SortOrder INT 
AS 

SELECT   name, 
       AVG(salary) AS avgSalary,    
       COUNT(employeeID) AS employeeCount    

FROM   employee 

ORDER BY CASE WHEN @SortOrder = 1 THEN avgSalary 
       WHEN @SortOrder = 2 THEN employeeCount 
       ELSE name 
     END 

回答

1

这可能会工作,基本上是一个事实,即在CASE声明所有表达式应该是强迫,能够在同一时间快速解决方法。

ALTER PROCEDURE GetEmployee 
@SortOrder INT 
AS 

SELECT   name, 
       AVG(salary) AS avgSalary,    
       COUNT(employeeID) AS employeeCount    

FROM   employee 

ORDER BY CASE WHEN @SortOrder = 1 THEN AVG(salary) END, 
     CASE WHEN @SortOrder = 2 THEN COUNT(employeeID) END, 
     CASE WHEN @SortOrder NOT IN (1, 2) THEN name END 
+0

Okey,太棒了!有没有办法添加DESC或ASC? – Nicklas 2012-02-04 10:44:13

+0

@Nicklas'AVG(salary)END DESC,... COUNT(employeeID)END ASC,...' – 2012-02-04 10:54:07

+0

真棒谢谢! – Nicklas 2012-02-04 10:55:30