订购带有非标准排序的结果(数字上升但最后是0/0)&为每行添加行号。

时间:2012-01-24 21:12:50

标签: sql-server-2005

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

我需要更多过滤......

  1. 需要MinPrice as ASC和MinPrice'0'在输出列表中排在最后(例如1, 5,6,10,8,0,0,0...

  2. ROW_NUMBER() OVER (---)按照上一次输出...

1 个答案:

答案 0 :(得分:1)

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

例如(参见下面的sortOrder):

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

假设我正确理解你的问题。

我改变你的8& 10我也假设你试图按计算的最小价格字段升序排序,但是在结束时而不是从开头算起0。所有非零值都得到一个sortOrder = 1,零值得到一个sortOrder = 0.它将零和非零值分开,这样你就可以根据需要对它们进行排序

至于#2 - 对于那个,你需要一个额外的列,其中包含有序值的行数。

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

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

这将根据输出order_by子句创建row_number()。

(请注意,我现在面前没有一个SQL Server实例来仔细检查语法。另外,我真的想检查一下,确保MSSQL不会因为w / row_number()。文档没有说什么,我也没有使用这个函数。但是这里是。)