2010-06-28 58 views
2

我需要一个存储过程,它允许我基于两个输入参数返回排序结果:@sortColumnName和@sortDirection。我编写了下面的存储过程,但是当我运行它时,出现此错误:“无效的列名'LastPayCheckDate'。”ORDER BY带CASE语句的别名列

SELECT Name, SUM(Pay), MAX(PayCheckDate) as LastPayCheckDate 
FROM Employee 
GROUP BY Name 
ORDER BY 
    CASE WHEN @sortColumnName = 'LastPayCheckDate' AND @sortDirection = 'ASC' 
     THEN [LastPayCheckDate] END ASC, 
    CASE WHEN @sortColumnName = 'LastPayCheckDate' AND @sortDirection = 'DESC' 
     THEN [LastPayCheckDate] END DESC 

这是怎么回事?我想t-sql在select之前运行case语句...我是对的吗?我该如何解决这个问题?

感谢您的帮助!

+0

您对使用动态SQL有什么看法? – 2010-06-28 17:22:52

+0

DBA不让我这样做。 – Martin 2010-06-28 17:23:37

+0

为什么不使用'Last(PayCheckDate)'而不是'[LastPayCheckDate]'? – Gabe 2010-06-28 17:27:15

回答

2

试试这个

ORDER BY 
    CASE WHEN @sortColumnName = 'LastPayCheckDate' AND @sortDirection = 'ASC' 
     THEN MAX(PayCheckDate) END ASC, 
    CASE WHEN @sortColumnName = 'LastPayCheckDate' AND @sortDirection = 'DESC' 
     THEN MAX(PayCheckDate) END DESC 

create table Test (id int, somevalue int) 

insert Test values(1,1) 
insert Test values(2,1) 
insert Test values(3,2) 
insert Test values(3,2) 
insert Test values(4,2) 

运行这1射

declare @sortDirection char(4) 
select @sortDirection = 'DESC' 

select somevalue, COUNT(*) 
from Test 
group by somevalue 
order by case when @sortDirection = 'ASC' 
then COUNT(*) end asc, 
case when @sortDirection = 'DESC' 
then COUNT(*) end desc 

select @sortDirection = 'ASC' 
select somevalue, COUNT(*) 
from Test 
group by somevalue 
order by case when @sortDirection = 'ASC' 
then COUNT(*) end asc, 
case when @sortDirection = 'DESC' 
then COUNT(*) end desc 
+0

我正在尝试,但它不起作用。查询运行,但没有排序。 :( – Martin 2010-06-28 17:32:02

+0

我改变了我的答案 – SQLMenace 2010-06-28 17:38:12

+0

太棒了!非常有用!非常感谢! – Martin 2010-06-28 17:38:45

0

您需要可以再次使用该功能,或者如果您想使用子查询能够引用列别名。

此外,我认为您需要确保case语句中的所有列都转换为相同的数据类型。