2010-06-28 78 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語句中的所有列都轉換爲相同的數據類型。