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…
)(请注意,我面前没有一个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