2012-01-24 33 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()。將添加到上面的答案。 –