【问题标题】:Calculating values of derived attributes in SQL在 SQL 中计算派生属性的值
【发布时间】:2015-10-30 17:16:31
【问题描述】:

我有一个包含两张桌子的餐厅数据库。其中一张表是'item',具有以下属性:

ItemID, ItemName, Price and Cuisine.

我有另一个表'bill',它具有以下属性:

OrderID, Item1_ID, Item2_ID, Item3_ID, Quantity_1, Quantity_2, Quantity_3, Total.

bill 的第 2、3、4 属性指定了 3 个具有不同 ItemID 的商品,第 5、6、7 属性指定了它们各自的数量。我想通过将它们各自的数量乘以它们的价格(取自“项目”表)来计算每个项目的价格,然后将它们各自的价格相加并保存结果。

1.我能够生成三个单独的价格,但由于它们是派生属性,我无法保存它们并因此更新“账单”的“总计”属性。我该怎么做呢?这是我用来生成三个单独价格的代码:

SELECT A.Total_1, B.Total_2, C.Total_3
FROM
(SELECT bill.orderid, bill.quantity_1 * item.Price AS 'Total_1'
FROM bill, item 
WHERE item.itemid = bill.item_1
)A,

(SELECT bill.orderid, bill.quantity_2 * item.Price AS 'Total_2'
FROM bill, item 
WHERE item.itemid = bill.item_2
)B,

(SELECT bill.orderid, bill.quantity_3 * item.Price AS 'Total_3'
FROM bill, item 
WHERE item.itemid = bill.item_3
)C

WHERE A.orderid = B.orderid AND A.orderid = C.orderid;
  1. 我应该删除属性“总计”,因为它是派生的?我确实希望在另一个表中使用它的值,那么他们有什么其他方法可以解决这个问题吗?

【问题讨论】:

  • 您想在数据库中插入商品和数量后立即计算总金额吗?
  • 没有。我已经插入了项目和数量。我想在需要时运行查询来计算总数。
  • 你接缝没有问题,你的项目可以在账单表中的任何一个位置吗?我的意思是你可以有这个例子:bill1 item_1 = idItem1 .., bill2 item_1 = idItem3 item_2 =idItem1 ... bill3 item_1 = idItem3 item_2 = idItem_2 item_3 = idItem3 ???

标签: sql xampp


【解决方案1】:

你可以像这样使用 somting:

select 
    item_1 * price_1 + item_2 * price_2 + item_3 * price_3 as total
    item_1 * price_1 as total_1
    item_2 * price_2 as total_2
    item_3 * price_3 as total_3
where orderId = yourOrderId

如果您在选择中进行逻辑操作(+、*、/、-),则与您将项目分开并以您喜欢的语言进行操作一样快。

【讨论】:

  • 它不起作用,因为我需要为每个项目使用单独的 itemID。我必须在“Where”语句中指定这一点。
  • 好的,你可以有组合吗?我的意思是如果有 1 个 id = 1 的项目,在计费中可以将这个组合与您的项目 id 组合:(1,0,0), (0,1,0), (0,0,1) 其中每个位置都表示您的item_pozition 和其中 1 这意味着您有 3 项不同订单的帐单。
  • 这样我就必须为每个 orderID 输入 3 个条目,对吗?然后逐行计算并更新总数?我会试试的。
  • 是的,这更容易和优化,如果您想为每件商品创建一个报告,您只需简单的加入即可查看每件售出商品的总数。
【解决方案2】:

一种快速简便的解决方案是将现有查询用作派生表并从中进行选择:

SELECT Total_1, Total_2, Total_3, 
 Total_1 + Total_2 + Total_3 AS GrandTotal
FROM (
SELECT A.Total_1, B.Total_2, C.Total_3
FROM
(SELECT bill.orderid, bill.quantity_1 * item.Price AS 'Total_1'
FROM bill, item 
WHERE item.itemid = bill.item_1
)A,

(SELECT bill.orderid, bill.quantity_2 * item.Price AS 'Total_2'
FROM bill, item 
WHERE item.itemid = bill.item_2
)B,

(SELECT bill.orderid, bill.quantity_3 * item.Price AS 'Total_3'
FROM bill, item 
WHERE item.itemid = bill.item_3
)C

WHERE A.orderid = B.orderid AND A.orderid = C.orderid
) T;

编辑:

要将GrandTotal 存储在表BillTotal 列中,您可以这样做:

UPDATE b2
SET Total = (
 SELECT A.Total_1 + B.Total_2 + C.Total_3
    FROM
    (SELECT bill.quantity_1 * item.Price AS 'Total_1'
    FROM bill, item 
    WHERE item.itemid = bill.item_1
    AND bill.Orderid=b2.Orderid
    )A,

    (SELECT bill.quantity_2 * item.Price AS 'Total_2'
    FROM bill, item 
    WHERE item.itemid = bill.item_2
    AND bill.Orderid=b2.Orderid
    )B,

    (SELECT bill.quantity_3 * item.Price AS 'Total_3'
    FROM bill, item 
    WHERE item.itemid = bill.item_3
    AND bill.Orderid=b2.Orderid
    )C
)
FROM Bill b2

【讨论】:

  • 我希望存储您定义为“GrandTotal”的变量,因为我想将其用于进一步查询。如果我使用 AS 选择它,我将无法做到这一点,对吧?
  • 当然可以。是什么让你认为你不会?
  • 结果会被保存吗?我的意思是每次执行此查询时,我都能看到总数,但如果我想在此之后执行另一个查询,我想使用总值来更新另一个表中的信息,该怎么办?
  • 您必须对其进行编码以保存结果,具体操作方式取决于您希望保存的方式,但当然可以采用多种不同的方式。
  • 您能解释一下如何保存吗?我只想保存 GrandTotal。
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 2017-03-06
  • 1970-01-01
  • 2016-09-02
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多