如何使用MSSQL中的聚合函数更新表中的两列?

如何使用MSSQL中的聚合函数更新表中的两列?,sql,sql-server,sql-update,aggregate-functions,Sql,Sql Server,Sql Update,Aggregate Functions,我试过几种选择,但找不到正确的解决方案。 我想更新Products表中的两列。 这些列需要从另一个名为ProductShops的表中更新 这两列分别命名为LowestPrice和LowestPriceShopId。 因此,我需要ProductShops中的总和NewPrice+DeliveryCosts中的最低值,以及该记录中的ShopId。 需要在产品表中更新 我尝试过的是: UPDATE Products SET LowestPrice = MIN(ps.NewPrice + ps.Del

我试过几种选择,但找不到正确的解决方案。 我想更新
Products
表中的两列。 这些列需要从另一个名为
ProductShops
的表中更新

这两列分别命名为
LowestPrice
LowestPriceShopId
。 因此,我需要
ProductShops
中的总和
NewPrice+DeliveryCosts
中的最低值,以及该记录中的
ShopId
。 需要在
产品
表中更新

我尝试过的是:

UPDATE Products 
SET LowestPrice = MIN(ps.NewPrice + ps.DeliveryCosts), 
LowestPriceShopId = ps.ShopId 
FROM Products 
INNER JOIN ProductShops ps ON Products.Id = ps.ProductId
错误消息:聚合可能不会出现在UPDATE语句的集合列表中

UPDATE p 
SET LowestPrice = ps2.totalPrice,
LowestPriceShopId = ps2.ShopId
FROM Products p JOIN
(select ps.ProductId, MIN(ps.NewPrice + ps.DeliveryCosts) AS totalPrice, ShopId FROM ProductShops ps) ps2
ON p.Id = ps2.ProductId
错误消息:“ProductShops.ProductId”列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

UPDATE Products
SET LowestPrice = (SELECT MIN(ps.NewPrice + ps.DeliveryCosts) 
FROM ProductShops ps WHERE ps.ProductId = p.Id)
FROM Products p

对于最后一个查询,我不知道如何获取
ShopId

您需要
分组方式

UPDATE p
SET LowestPrice = ps2.totalPrice,
    LowestPriceShopId = ps2.ShopId
FROM Products p
JOIN (SELECT
    ps.ProductId,
    MIN(ps.NewPrice + ps.DeliveryCosts) AS totalPrice,
    ShopId
FROM ProductShops ps
GROUP BY ps.ProductId,ShopId) ps2
    ON p.Id = ps2.ProductId
UPDATE p 
SET LowestPrice = ps2.totalPrice,
LowestPriceShopId = ps2.ShopId
FROM Products p 
JOIN
(
    select 
        ps.ProductId, 
        MIN(ps.NewPrice)+MIN(ps.DeliveryCosts) AS totalPrice, 
        ShopId 
    FROM 
        ProductShops ps
    GROUP BY
        ps.ProductId,
        ps.ShopId
) ps2
ON p.Id = ps2.ProductId

ProductId
ShopId
上,我找到了正确的解决方案:

UPDATE p 
SET LowestPrice = ps3.totalPrice,
LowestPriceShopId = ps3.ShopId
FROM Products p 
JOIN
(
SELECT ps1.ProductId, ps1.NewPrice + ps1.DeliveryCosts as totalPrice, ps1.ShopId FROM ProductShops ps1 
LEFT JOIN ProductShops ps2
ON ps1.ProductId = ps2.ProductId AND (ps1.NewPrice + ps1.DeliveryCosts) > (ps2.NewPrice + ps2.DeliveryCosts)
WHERE ps2.NewPrice is NULL AND ps2.DeliveryCosts is NULL
) ps3
ON p.Id = ps3.ProductId

我有两个ProductShops记录具有相同的ProductId,但是如果我运行查询,最高价格将添加到产品记录中。你知道这是怎么发生的吗?@Pim:我更新了答案。可能是
ps.NewPrice+ps.DeliveryCosts
的总成本高于
NewPrice
DeliveryCosts
个人成本。所以像这样测试查询