2017-08-08 36 views
0

增加數量的,我有以下表TableAllProdsSQL服務器中:選擇最高價和從表

ProdName  ManuPartNo Price Qty Supplier 
-------------------------------------------------- 
Part1   R10001  100.00 2  Supp1 
Part2   R10002  500.00 2  Supp2 
Part3   R30023  50.00 1  Supp3 
Part2again R10002  100.00 5  Supp4 
Part2Again R10002  300.00 10  Supp5 
Part1again R10001  200.00 5  Supp3 

我有一個select語句給我帶回來,如果有不同的重複產品的正常工作的最高價供應商。

SELECT 
    ProdName, ManuPartNo, Price, Qty, Supplier 
FROM 
    (SELECT 
     dbo.TableAllProds.*, 
     ROW_NUMBER() OVER (PARTITION BY ManuPartNo ORDER BY Price ASC) AS RN 
    FROM 
     dbo.TableAllProds) AS t 
WHERE 
    RN = 1 
ORDER BY 
    ManuPartNo 

不過,我也想計算一下全部數量的對所有供應商舉例ManuPartNo - R10001我想回R10001 - 200.00 - 7(數量)和最高價格,如果可能的供應商。

不知道如何google一下,我可以很方便地返回的最高/最低的價格,也返回數量爲各部分的總和,但我不知道如何同時執行這兩個查詢。

感謝您的任何幫助。

+0

做它作爲派生表得到總的一部分,然後加入回過上ManuPartNo – Leonidas199x

回答

2

您可以使用SUM作爲窗口函數:

SELECT ProdName, ManuPartNo, Price, Qty, TotalQty, Supplier 
FROM ( SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY ManuPartNo ORDER BY Price ASC) AS RN, 
       SUM(Qty) OVER(PARTITION BY ManuPartNo) AS TotalQty, 
     FROM dbo.TableAllProds) AS t 
WHERE RN = 1 
ORDER BY ManuPartNo; 
+0

Lamak這個完美工作,三江源非常多。我都將使用這幾個地方不是肯定從哪裏開始,(還了解了派生表,謝謝。 –

0

這似乎是你想要的...取消對where子句,如果你只想要那個供應商。

declare @TableAllProds table (ProdName varchar(16), ManuPartNo varchar(16), Price decimal (5,2), Qty int, Supplier varchar(16)) 
insert into @TableAllProds 
values 
('Part1','R10001',100.00,2,'Supp1'), 
('Part2','R10002',500.00,2,'Supp2'), 
('Part3','R30023',50.00,1,'Supp3'), 
('Part2again','R10002',100.00,5,'Supp4'), 
('Part2Again','R10002',300.00,10,'Supp5'), 
('Part1again','R10001',200.00,5,'Supp3') 

;WITH CTE AS(
SELECT 
    ProdName, 
    ManuPartNo, 
    Price, 
    Supplier, 
    sum(Qty) over (partition by ManuPartNo) TotalOverAllSuppliers, 
    case when Price = max(price) over (partition by ManuPartNo) then Supplier end HighestPricedSupplier 
FROM 
    @TableAllProds) 

select 
* 
from cte 
--where HighestPricedSupplier is not null 
0

您可以查詢如下使用ROW_NUMBER:

Select * from (
    Select *, RowN = Row_Number() over(Partition by ManuPartNo order by Price desc), SmQty = Sum(Qty) over(Partition by ManuPartNo) from dbo.TableAllProds) a 
    where a.RowN = 1 
0
SELECT a.ManuPartNo, a.Price, a.QTY, b.Supplier 
FROM (SELECT t1.ManuPartNo, MAX(t1.Price) AS Price, SUM(t1.Qty) AS QTY 
     FROM dbo.alltableprods t1 
     GROUP BY t1.ManuPartNo) a 
JOIN (SELECT t2.ManuPartNo, t2.price, T2.Supplier, 
     ROW_NUMBER() OVER (PARTITION BY t2.ManuPartNo ORDER BY t2.price desc) 
     AS RN 
     FROM dbo.alltableprods t2 
     GROUP BY t2.ManuPartNo, t2.Price, t2.Supplier) b ON a.ManuPartNo = 
b.ManuPartNo 
WHERE b.RN = 1 

使用這將返回

R10001 200.00 7 Supp3 
R10002 500.00 17 Supp2 
R30023 50.00 1 Supp3 

我有一個問題,雖然。是否有可能在那裏是具有在同價位同一部分多個供應商?如果是這樣那麼這將仍然工作但是它只是抓住它首先找到任何適用的供應商。