ORDER BY带CASE语句的别名列
问题描述:
我需要一个存储过程,它允许我基于两个输入参数返回排序结果:@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语句...我是对的吗?我该如何解决这个问题?
感谢您的帮助!
答
试试这个
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
答
您需要可以再次使用该功能,或者如果您想使用子查询能够引用列别名。
此外,我认为您需要确保case语句中的所有列都转换为相同的数据类型。
您对使用动态SQL有什么看法? – 2010-06-28 17:22:52
DBA不让我这样做。 – Martin 2010-06-28 17:23:37
为什么不使用'Last(PayCheckDate)'而不是'[LastPayCheckDate]'? – Gabe 2010-06-28 17:27:15