【问题标题】:Trouble facing creating a stored procedure面临创建存储过程的麻烦
【发布时间】:2018-12-26 16:00:38
【问题描述】:

我有两张表 Product 和 OrderItem,如屏幕截图所示。

我想创建一个存储过程来更新Product 表的TotalSale 列,其中包含从该特定产品的所有销售中收集的金额。

要填充TotalSale 列,我必须通过将UnitPrice 和Quantity 列相乘,从OrderItem 逐行多次计算同一产品的总金额,然后再次添加这些多个总金额每个产品以获得每个产品的总销售额。我是初学者,无法弄清楚。

我在OrderItem添加了一个专栏:

ALTER TABLE OrderItem 
    ADD TotalSale DECIMAL NULL

UPDATE dbo.OrderItem 
SET TotalSale = UnitPrice * Quantity

然后我计算了每个产品的多个总金额的总和,以获得每个产品的总销售额:

SELECT 
    SUM(TotalSale) AS Gross 
FROM 
    OrderItem 
GROUP BY 
    ProductId

现在,作为初学者,我无法弄清楚如何使用计算出的总值填充该列。任何提示或帮助将不胜感激!

【问题讨论】:

  • 请提供相关表格的结构。另外,请提供一个简单的示例,插入您需要的数据和预期的结果。
  • 您似乎忘记包含该屏幕截图,但是,请不要。在提供表的详细信息时,将其作为 DDL 语句提供。如果您要提供数据,请为这些表(您为其提供 DDL 语句的表)提供 DML 语句。数据图像对您寻求帮助的人没有帮助;使您的问题获得答案的可能性大大降低。还请务必包含您尝试创建所需 SP 的完整 SQL 语句,并解释它为什么不起作用。谢谢。
  • 我一直在编写插入语句:插入 Product TotalSale ( select sum(UnitPrice*Quantity) from OrderItem group by ProductId) 不知道怎么写。我知道我想做什么,但怎么做是我卡住的地方。
  • “如何使用计算的 totl 值填充该列”将计算结果存储在 SQL 表中通常违反所有规范化“规则”。因此可以创建一个 VIEW(您计算的地方)并查询该视图相反.. 或使用 CTE (WITH ... AS...) 查询

标签: sql sql-server


【解决方案1】:

你对问题的描述一开始有点难以理解,我会尽力帮助你的,我相信你可以完美做到:

  With MyCTE AS
    ( SELECT SUM(TSale) AS TotalSaleOI
       FROM OrderItem GROUP BY ProductId
    )
UPDATE P
SET TotalSale = C.TotalSaleOI
FROM Product AS P
INNER JOIN MyCTE AS C ON P.ProductId = C.ProductoId

【讨论】:

    【解决方案2】:

    根据您的屏幕截图,我认为以下查询对您有用:

    UPDATE Product
    SET TotalSale = COALESCE(
        (SELECT SUM(TotalSale) 
        FROM OrderItem 
        WHERE OrderItem.ProductID = Product.ProductID), 0)
    

    ISNULL 子句将确保如果该产品没有订单,它会计算 0 作为结果。

    【讨论】:

    • 使用COALESCE(与IFNULL具有相同的结构),然后你就有跨数据库供应商支持,因为COALESCE是ANSII SQL
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2010-09-12
    • 2015-05-10
    相关资源
    最近更新 更多