【问题标题】:Calculating Income - Expenses using 3 tables in SQL使用 SQL 中的 3 个表计算收入 - 费用
【发布时间】:2020-07-26 19:33:09
【问题描述】:

我正在尝试找到一种方法来编写一个简单的查询,并且在使用 Left/Right JOIN 函数时遇到了一些困难。

基本上,我想对所有出售给客户的商品 INCOME 求和 然后将所有费用相加,即支付给供应商的工资和付款(为了简单起见)

产品订单表如下所示:

╔══════════════╦════════════════╦══════════════════╗
║ order_number ║ product_number ║ product_quantity ║
╠══════════════╬════════════════╬══════════════════╣
║ 1000001      ║ 150009         ║ 50               ║
╠══════════════╬════════════════╬══════════════════╣
║ 1000002      ║ 150001         ║ 4100             ║
╠══════════════╬════════════════╬══════════════════╣
║ 1000002      ║ 150002         ║ 1200             ║
╠══════════════╬════════════════╬══════════════════╣
║ 1000002      ║ 150003         ║ 1350             ║
╠══════════════╬════════════════╬══════════════════╣
║ 1000002      ║ 150004         ║ 8200             ║
╠══════════════╬════════════════╬══════════════════╣

产品价格表如下所示:

╔════════════╦══════════════════════════════════╦═══════════════╗
║ product_id ║ product_name                     ║ product_price ║
╠════════════╬══════════════════════════════════╬═══════════════╣
║ 150001     ║ Printing Paper                   ║ 13.00         ║
╠════════════╬══════════════════════════════════╬═══════════════╣
║ 150002     ║ Coated Paper                     ║ 8.00          ║
╠════════════╬══════════════════════════════════╬═══════════════╣
║ 150003     ║ Tissue Paper                     ║ 9.00          ║
╠════════════╬══════════════════════════════════╬═══════════════╣
║ 150004     ║ Cardboard                        ║ 9.00          ║
╠════════════╬══════════════════════════════════╬═══════════════╣
║ 150005     ║ Paperboard                       ║ 7.00          ║
╠════════════╬══════════════════════════════════╬═══════════════╣
║ 150006     ║ Carton                           ║ 5.00          ║
╠════════════╬══════════════════════════════════╬═══════════════╣
║ 150007     ║ Fineart Paper                    ║ 26.00         ║
╠════════════╬══════════════════════════════════╬═══════════════╣
║ 150008     ║ Pilot Pen 0.4                    ║ 5.00          ║
╠════════════╬══════════════════════════════════╬═══════════════╣
║ 150009     ║ Stabilo Boss Highligher - Yellow ║ 4.50          ║
╚════════════╩══════════════════════════════════╩═══════════════╝

向供应商支付的款项与产品基本相同,只需从产品利润结果中扣除,并与所有员工的工资总和相结合即可。

我总共有 2 个收入表和 3 个费用表(员工、材料订单、材料价格)。

我最终的目标是:

╔══════════════╗
║ total_profit ║
╠══════════════╣
║ 2305000      ║
╚══════════════╝

产品订单:

CREATE TABLE Customer_Order_Details (
co_ID INT, #FK
p_ID INT, #FK
cod_quantity INT NOT NULL,
FOREIGN KEY (co_ID) REFERENCES Customer_Order (co_ID) ON DELETE CASCADE,
FOREIGN KEY (p_ID) REFERENCES Product (p_ID) ON DELETE CASCADE,
PRIMARY KEY (co_ID, p_ID)
);

产品价格表:

CREATE TABLE Product (
p_ID INT PRIMARY KEY,
p_name VARCHAR(80) NOT NULL,
p_price NUMERIC(10,2) 
);

*编辑-尝试在第一和第二表之间组合并从第三表中扣除

SELECT SUM(e.e_salary)/4 AS salary_expenses
FROM Employee AS e;

SELECT SUM(vod.vod_quantity * rm.rm_price) AS total_rm_expenses
FROM Vendor_Order_Details AS vod
JOIN Raw_Material AS rm ON rm.rm_ID = vod.rm_ID;

SELECT SUM(cod.cod_quantity * p.p_price) AS total_income
FROM Customer_Order_Details AS cod
JOIN Product AS p ON p.p_ID = cod.p_ID;

谢谢!!

【问题讨论】:

    标签: sql


    【解决方案1】:

    您的问题不包括有关费用的详细信息,因此无法计算利润。但是,您可以计算收入

    例如,你可以这样做:

    select sum(o.cod_quantity * p.p_price) as total_revenue
    from Customer_Order_Details o
    join Product p on p.p_id = o.p_id
    

    编辑 - 计算利润

    由于您的三个查询每个都生成一行,因此您可以使用CROSS JOINs 将它们组合起来。例如:

    select
      c.total_revenue - a.salary_expenses - b.total_rm_expenses as total_profit
    from (
      SELECT SUM(e.e_salary)/4 AS salary_expenses
      FROM Employee
    ) a
    cross join (
      SELECT SUM(vod.vod_quantity * rm.rm_price) AS total_rm_expenses
      FROM Vendor_Order_Details AS vod
      JOIN Raw_Material AS rm ON rm.rm_ID = vod.rm_ID
    ) b
    cross join (
      SELECT SUM(cod.cod_quantity * p.p_price) AS total_revenue
      FROM Customer_Order_Details AS cod
      JOIN Product AS p ON p.p_ID = cod.p_ID
    ) c
    

    【讨论】:

    • 谢谢,如果我想从这个结果中扣除费用,我需要执行另一个加入吗?材料总和与收入总和计算方法相同,应与所有员工工资总和相结合
    • @RonSwanson 是的,你应该在单独的查询中计算费用,然后你可以加入它们并减去它们。
    • 我用 3 查询编辑了帖子。在这种情况下我应该使用 UNION 吗?我想把这两项费用结合起来从收入中扣除
    • @RonSwanson 我添加了一个示例,说明如何将所有三个查询组合为另一个查询的子查询。
    猜你喜欢
    • 2018-09-07
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2020-12-24
    • 1970-01-01
    • 2019-06-27
    • 2021-10-24
    相关资源
    最近更新 更多