Mark
Mark

Reputation: 717

SQL Server 2005 problem with ROW_NUMBER() OVER (ORDER BY ...)

This question is in relation to a previous question I've asked ... see "SQL Server 2005 How to order a recordset when using the LIKE operator".

The following works ...

with xx as
(
select  case
    when mycol = 'finance' then 1
    when mycol like 'finance%' then 2
    when mycol like '%finance%' then 3
    end as rnk, 
    *
from    MyTable
where   mycol like '%finance%'
)

select * from xx 
order by xx.rnk, xx.mycol;

But what I really want to do is this, as I'm using the server to page through records ...

WITH xx AS
(
select  case
    when t.term = 'finance' then 1
    when t.term like 'finance%' then 2
    when t.term like '%finance%' then 3
    end as rnk, 
    *, 
    row_number() over (order by rnk, t.term) as rownumber
from    tblTerms t
where   t.term like '%finance%'
)

select * from xx 
where rownumber between 11 and 20 -- page #2
order by xx.rnk, xx.mycol;

I'm getting an error " Invalid column name 'rnk' ".

Does anyone have any ideas on how to solve this problem?

Many thanks,

Mark

Upvotes: 1

Views: 1883

Answers (1)

bobs
bobs

Reputation: 22184

The problem is in the common table expression (CTE) definition. You can't reference rnk in the same SELECT clause where the column alias is defined. You can try this:

WITH xx AS
(
select  case
    when t.term = 'finance' then 1
    when t.term like 'finance%' then 2
    when t.term like '%finance%' then 3
    end as rnk, 
    *
from    tblTerms t
where   t.term like '%finance%'
),

yy AS
(
SELECT *,
    row_number() over (order by rnk, term) as rownumber
FROM xx
)

select * from yy 
where rownumber between 11 and 20 -- page #2
order by yy.rnk, yy.mycol;

Upvotes: 1

Related Questions