2016-02-24 29 views
0

enter image description here选择范围与行号

我从SQL Server 2008表,按相反的顺序(DESC)序列号(行号)需要的数据。

我的表名是ProductDetails

我用这个查询

WITH Sum_Ctl (TOt) as 
(
    select count(*)+1 
    from ProductDetails 
    where ProductDetails.UserId = 38 
) 
SELECT 
    Tot - ROW_NUMBER() OVER (ORDER BY PrdID asc) AS SNO, 
    * 
FROM 
    ProductDetails, Sum_Ctl 
WHERE 
    UserId = 38 

2192行数据存在于表用户38.我使用上面的查询

SNO column 2192 2191 2190 .... to 1 

问题得到它:我需要20行数据,即2020年至2000年只有

我试图and SNO between 2020 and 2000与查询,但得到

无效的列名称'SNO'。

然后我试图

where 
    UserId = 38 
    and Tot - ROW_NUMBER() OVER (ORDER BY PrdID asc) between 2020 and 2000 

窗函数只能出现在SELECT或ORDER BY子句。

任何帮助,将在这里感谢

+0

认真你已经搞砸了查询请发布样本数据和输出 – mohan111

+0

@ mohan111感谢您的回复,添加了示例屏幕截图 – Fool

回答

2

有问题是你不能where子句中使用窗口功能。这是logical processing order的后果。简而言之,在所有其他处理完成后生成行号,包括您​​在where中可能使用的任何过滤器。

您可以使用子查询或CTE解决此限制。在这个例子中ROW_NUMBER是在子查询中计算的。这又由主查询过滤。

SELECT 
    * 
FROM 
    (
     -- SNIO will be available to outer WHERE. 
     SELECT 
      ROW_NUMBER() OVER (ORDER BY PrdID ASC) AS sno, 
      * 
     FROM 
      ProductDetails 
     WHERE 
      ProductDetails.UserId = 38 
    ) AS sq 
WHERE 
    sno BETWEEN 2000 AND 2020 
; 

此操作,因为子查询其全部处理,则结果被传递到外部查询之前。

+0

感谢您的答案,但“关键字附近的语法不正确” – Fool

+0

Doe the UserId列存在于ProductDetails中? –

+0

是的,UserId有 – Fool