Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 带非标准排序的排序结果(数字升序,但结尾带0';s)&;为每行添加行号。_Sql Server 2005 - Fatal编程技术网

Sql server 2005 带非标准排序的排序结果(数字升序,但结尾带0';s)&;为每行添加行号。

Sql server 2005 带非标准排序的排序结果(数字升序,但结尾带0';s)&;为每行添加行号。,sql-server-2005,Sql Server 2005,我需要更多的过滤 需要MinPrice作为ASC,并且MinPrice'0'在输出列表中位于最后(例如1,5,6,10,8,0,0,0…) (--)上的行号()根据上次输出 对于#1,要创建这样的排序顺序(1、5、6、8、10、0、0、0),可以创建另一个可以排序的列,并将所需的特殊排序条件嵌入该列的定义中 例如(参见下面的排序器): 假设我正确理解你的问题 我切换了你的8和10,并且我假设你正在尝试按计算出的最低价格字段升序排序,但是0在末尾而不是开始。所有非零值都将获得sortOrder=1

我需要更多的过滤

  • 需要
    MinPrice作为ASC
    ,并且MinPrice'0'在输出列表中位于最后(例如
    1,5,6,10,8,0,0,0…

  • (--)上的行号()根据上次输出

  • 对于#1,要创建这样的排序顺序(1、5、6、8、10、0、0、0),可以创建另一个可以排序的列,并将所需的特殊排序条件嵌入该列的定义中

    例如(参见下面的排序器):

    假设我正确理解你的问题

    我切换了你的8和10,并且我假设你正在尝试按计算出的最低价格字段升序排序,但是0在末尾而不是开始。所有非零值都将获得sortOrder=1,零值将获得sortOrder=0。它将零值和非零值分开,因此您可以根据需要对它们进行排序

    至于#2——对于这一个,您需要在select中增加一列,其中包括有序值的行号

    唯一简单的方法是通过row_number()实现

    这将基于输出ORDERBY子句创建行号()


    (请注意,我面前没有一个SQL Server实例来仔细检查语法。另外,我真的想检查一下,以确保MSSQL不会阻止按行数()组合分组。文档没有说明什么,我也不经常使用此函数。但这里有。)

    这真的不清楚。你能举例说明你想要的输出吗?在#2中,我需要输出中的行号,如1、2、3、4等,以创建“分页”。例如:DECLARE#StartRow INT;声明#EndRow INT;设置#StartRow=0;设置#EndRow=3--“RowNumber>#StartRow和RowNumber<#EndRow”首先对#1有帮助吗?至于#2,您需要row#u number()函数。对#1的回答是一般性的,但对于#2,您只能(轻松地)使用sql server扩展来完成。行号()。将补充上述答案。#1对我的工作非常有帮助。。。你能解释一下查询row_number()函数吗?我在#2上出错了。Msg 207,级别16,状态1,第26行无效列名“sortOrder”。Msg 207,16级,状态1,第26行无效列名“MinPrice”。
    SET NOCOUNT ON 
    
    DECLARE @Products TABLE (product_id VarChar(50),product_name VarChar(50) )
    
    INSERT INTO @Products Values ('1','Pen');
    INSERT INTO @Products Values ('2','Pencil');
    INSERT INTO @Products Values ('3','School Bag');
    INSERT INTO @Products Values ('4','Book');
    INSERT INTO @Products Values ('5','Pencil Box');
    
    SET NOCOUNT ON 
    
    DECLARE @Rates TABLE (product_id VarChar(50),price int )
    
    INSERT INTO @Rates Values ('1','10');
    INSERT INTO @Rates Values ('3','5');
    INSERT INTO @Rates Values ('1','5');
    INSERT INTO @Rates Values ('4','20');
    INSERT INTO @Rates Values ('4','15');
    INSERT INTO @Rates Values ('5','30');
    
    SELECT count(*) over() Total_Record,
        p.product_id, p.product_name,  ISNULL(MIN(r.price), 0) AS MinPrice 
    FROM 
        @Products p 
    LEFT OUTER JOIN
        @Rates r 
    ON
        r.product_id = p.product_id 
    GROUP BY 
        p.product_id, p.product_name
    ORDER BY
        p.product_name
    
    SELECT count(*) over() Total_Record,
        p.product_id, p.product_name,  
        ISNULL(MIN(r.price), 0) AS MinPrice,
        case when ISNULL(MIN(r.price), 0) > 0 then 1 else 0 end as sortOrder
    FROM @Products p  
    LEFT OUTER JOIN @Rates r  ON
        r.product_id = p.product_id  
    GROUP BY 
        p.product_id, p.product_name 
    ORDER BY
        sortOrder desc, MinPrice asc
    
    SELECT count(*) over() Total_Record,
        p.product_id, p.product_name,  
        ISNULL(MIN(r.price), 0) AS MinPrice,
        case when ISNULL(MIN(r.price), 0) > 0 then 1 else 0 end as sortOrder,
        row_number() OVER(order by sortOrder desc, MinPrice asc) as rowNumber
    FROM @Products p  
    LEFT OUTER JOIN @Rates r  ON
        r.product_id = p.product_id  
    GROUP BY 
        p.product_id, p.product_name 
    ORDER BY
        sortOrder desc, MinPrice asc