MySQL SUM函数将结果乘以行数

brc7rcf0  于 2023-11-16  发布在  Mysql
关注(0)|答案(1)|浏览(97)

相对缺乏经验的SQL数据库,而不是从多个表等选择信息,没有任何内置的工作.我正在建立一个网站,管理员可以输入和跟踪项目-这包括最初添加一个项目(参考/名称和项目价值),然后,他们可以针对该项目添加费用。其他网站用户/员工也可以填写时间表,并针对该工作分配他们的时间/工资(从projects表中填充的视图中选择)
我目前正在构建一个页面,管理员可以跟踪工作的利润/损失。这显示了工作细节,费用总额,劳动力总额和利润/损失数字-试图从MySQL中一次性获得所有信息,而不是获取所有行并稍后使用php/js进行操作。
我有以下表格:
项目表
| ID|客户|作业参考|值|结束日期|
| --|--|--|--|--|
| 1 |客户A|作业A| 1000 |2023-11-10 2023-11-10|
| 2 |客户B|作业A| 1500 |2023-11-10 2023-11-10|
费用表
| 项目ID|进出口额|
| --|--|
| 1 | 250 |
| 1 | 250 |
工时表
| 项目ID| project_ref|支付总额|
| --|--|--|
| 1 |作业A|一百|
| 1 |作业A|一百|
| 1 |作业A|零点|
SQL查询

SELECT 
    MIN(p.id) AS Pro_ID,
    MAX(p.customer) AS Pro_Customer,
    MAX(p.job_reference) AS Pro_Ref,
    MAX(p.value) AS Pro_Value,
    MAX(p.end_date) AS Pro_End,
    SUM(e.exp_amount) AS expense,
    SUM(t.pay_total) AS LabourPaid,
    COALESCE(SUM(t.pay_total), 0) AS LabourCostings,
    ROUND(SUM(IFNULL(t.pay_total, 0)), 2) AS LabourCosts,
    IFNULL(SUM(t.pay_total), 0) AS LabourCost,
    ROUND(MAX(p.value) - (SUM(IFNULL(e.exp_amount, 0))),
            2) AS Profit
FROM
    projects p
        JOIN
    expenses e ON e.project_id = p.id
        LEFT OUTER JOIN
    timesheets t ON t.project_id = p.id
        AND t.project_ref = p.job_reference
GROUP BY p.end_date
ORDER BY p.end_date ASC

字符串
我面临的问题是:
1 -如果没有为项目输入时间表信息,则该项目根本不会显示
2 -费用和劳动力成本到处都是-它们似乎被乘以行数或结果数,但不一定是与该行相关的结果数。
我试过在计算中间查询,也是不同的JOINS。
我希望id = 1的项目的结果是
| ID|专业客户|Pro_Ref| Pro_Value|前_结束|费用|'任何劳动力计算'|利润|
| --|--|--|--|--|--|--|--|
| 1 |客户A|作业A| 1000 |2023-11-10 2023-11-10| 500 | 200 | 300 |
我觉得我的方式与我的查询-我已经阅读了关于子查询,但不完全理解它后,几次尝试-这甚至是正确的前进方向?我要求从一个单一的查询多?或者我沿着正确的路线?我已经在这里和其他网站上搜索,似乎找不到任何东西,指出我在正确的方向。
感谢您抽出宝贵的时间。

tp5buhyn

tp5buhyn1#

您可以创建多条线,其中左侧的列0重复。
一种方法是在加入之前计算项目成本和收益

SELECT 
    MIN(p.id) AS Pro_ID,
    MAX(p.customer) AS Pro_Customer,
    MAX(p.job_reference) AS Pro_Ref,
    MAX(p.value) AS Pro_Value,
    MAX(p.end_date) AS Pro_End,
    SUM(e.exp_amount) AS expense,
    SUM(t.pay_total) AS LabourPaid,
    COALESCE(SUM(t.pay_total), 0) AS LabourCostings,
    ROUND(SUM(IFNULL(t.pay_total, 0)), 2) AS LabourCosts,
    IFNULL(SUM(t.pay_total), 0) AS LabourCost,
    ROUND(MAX(p.value) - (SUM(IFNULL(e.exp_amount, 0))),
            2) AS Profit
FROM
    projects p
        JOIN
    (SELECT project_id, SUM(exp_amount) exp_amount FROM  expenses  GROUP BY project_id) e ON e.project_id = p.id
        LEFT OUTER JOIN
    (SELECT project_id,MAX(project_ref) project_ref, SUM(pay_total) pay_total FROM timesheets GROUP BY project_id) t ON t.project_id = p.id
        AND t.project_ref = p.job_reference
GROUP BY p.end_date
ORDER BY p.end_date ASC

字符串
| Pro_ID|专业客户|Pro_Ref| Pro_Value|前_结束|费用|劳动报酬|劳动力成本|劳动力成本|人工成本|利润|
| --|--|--|--|--|--|--|--|--|--|--|
| 1 |客户A|作业A| 1000 |2023-11-10 2023-11-10| 500 | 200 | 200 | 200 | 200 | 500 |
fiddle

相关问题