SQL Server:从表中选择最高价格并添加数量

SQL Server:从表中选择最高价格并添加数量,sql,sql-server,Sql,Sql Server,我有下表TableAllProds: 我有一个选择声明,让我回到最高的价格,如果有重复的产品,从不同的供应商良好的工作 SELECT ProdName, ManuPartNo, Price, Qty, Supplier FROM (SELECT dbo.TableAllProds.*, ROW_NUMBER() OVER (PARTITION BY ManuPartNo ORDER BY Price ASC) AS RN FROM

我有下表TableAllProds:

我有一个选择声明,让我回到最高的价格,如果有重复的产品,从不同的供应商良好的工作

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数量和最高价格的供应商

不知道如何谷歌这个,我可以很容易地返回最高/最低价格,也可以返回每个部分的数量总和,但不知道如何同时执行这两个查询

谢谢您的帮助。

您可以使用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;
您可以将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;

这似乎是你想要的。。。如果只需要该供应商,请取消注释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

这似乎是你想要的。。。如果只需要该供应商,请取消注释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

您可以使用以下行号进行查询:

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

您可以使用以下行号进行查询:

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
使用此选项将返回

R10001  200.00  7   Supp3
R10002  500.00  17  Supp2
R30023  50.00   1   Supp3
不过我有个问题。是否可能有多个供应商以相同的价格拥有相同的零件?如果是这样的话,这将仍然有效,但是它将首先抓住任何适用的供应商

使用此选项将返回

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

不过我有个问题。是否可能有多个供应商以相同的价格拥有相同的零件?如果是这样的话,这仍然有效,但是它只会首先抓取它找到的任何适用供应商。

将其作为派生表来获取零件的总数,然后将其重新连接到ManuPart上。将其作为派生表来获取零件的总数,然后将其重新连接到ManuPartNoLamak上这非常有效,非常感谢。我将在几个地方使用这个,不知道从哪里开始,还学习了派生表,谢谢大家。Lamak这个工作非常好,非常感谢。我将在一些地方使用它。我不知道从哪里开始,还了解了派生表,谢谢大家。谢谢大家的评论,大家都对我有一些看法,很高兴看到同一问题的不同方法。谢谢大家的评论,大家都对我有一些看法,很高兴看到同一问题的不同方法。