2012-01-24 27 views
0
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 

我需要一些更多的过滤....订购结果w /非标准订购(数量上升但最终为w/0)&为每行添加行号。

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

  2. ROW_NUMBER() OVER (---)按照最后的输出。 ...

+2

这真的不清楚。你能用你想要的输出的例子来澄清吗? – mwigdahl

回答

1

对于#1,要创建像这样的排序顺序(1,5,6,8,10,0,0,0),您可以创建另一个r列,可以对其进行排序,并根据该列的定义嵌入所需的特殊排序条件。

例如(见下文中将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不会妨碍将组合通过瓦特/秒进行组合, row_number()。docs什么都没说,我也不用这个函数,但是这里是。)

+0

在#2我需要输出row_number像1,2,3,4等创建“PAGINATION”。例如:DECLARE #StartRow INT; DECLARE #EndRow INT; SET #StartRow = 0; SET #EndRow = 3; - “RowNumber> #StartRow AND RowNumber <#EndRow” – user475464

+0

First对此有帮助#1? –

+0

至于#2,你需要row_number()函数。 #1的答案是一般的,但对于#2,你只能做到(很容易)w/sql服务器扩展。 ROW_NUMBER()。将添加到上面的答案。 –