SQL Server:从表中选择最高价格并添加数量
我有下表TableAllProds: 我有一个选择声明,让我回到最高的价格,如果有重复的产品,从不同的供应商良好的工作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
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这个工作非常好,非常感谢。我将在一些地方使用它。我不知道从哪里开始,还了解了派生表,谢谢大家。谢谢大家的评论,大家都对我有一些看法,很高兴看到同一问题的不同方法。谢谢大家的评论,大家都对我有一些看法,很高兴看到同一问题的不同方法。