Mysql 使用查询动态输出设备总使用量和总归还量

Mysql 使用查询动态输出设备总使用量和总归还量,mysql,sql,Mysql,Sql,您好,下午好/早上好,我有一个逻辑错误,即如何正确输出每台设备的总使用量,以及该设备的总退货量 此表的示例:(每个表都有其总数量) 设备表: 设备使用情况表: 设备退货使用情况表: 一旦项目使用设备,设备将记录在“设备使用情况”表中,如果项目返回特定设备,则将设备记录器返回到“设备返回”表中 以下是我对如何输出数据的疑问: 预期输出: 所有设备将在列中提取,包括可用设备、使用设备、返回设备,我的公式显示此表的想法是: total_equipment as total_quanti

您好,下午好/早上好,我有一个逻辑错误,即如何正确输出每台设备的总使用量,以及该设备的总退货量

此表的示例:(每个表都有其总数量)

设备表:


设备使用情况表:


设备退货使用情况表:


一旦项目使用设备,设备将记录在“设备使用情况”表中,如果项目返回特定设备,则将设备记录器返回到“设备返回”表中

以下是我对如何输出数据的疑问:


预期输出:

所有设备将在列中提取,包括可用设备、使用设备、返回设备,我的公式显示此表的想法是:

total_equipment as total_quantity,
(total_equipment - total_usage of equipment) as available,
total_usage of equipment,
total_return of equipment


所有形式的查询都被接受,只是为了输出这个预期的表,提前谢谢。:)

要解决此问题,需要在执行联接之前进行聚合。看起来是这样的:

SELECT e.equip_ID, e.equip_Name,u.unit_Name,
      COALESCE(eu.usage_quantity, 0) as usage_quantity,
      COALESCE(er.return_quantity, 0) as return_quantity
FROM equipment e INNER JOIN
     unit u
     ON u.unit_ID = e.unit_ID LEFT JOIN
     (SELECT eu.equip_id, SUM(eu.usage_Quantity) as usage_Quantity
      FROM equipment_usage eu
      GROUP BY eu.equip_ID
     ) eu
     ON eu.equip_ID = e.equip_ID LEFT JOIN
     (SELECT eu.equip_id, SUM(er.return_Quantity) as return_Quantity
      FROM equipment_return er JOIN
           equipment_usage eu
           ON er.usage_ID = eu.usage_ID
      GROUP BY eu.equip_id
     ) er
     ON er.equip_ID = e.equip_ID;

是一个SQL FIDLE。

您不能在最终查询中包含用法id,因为用法表中有多个设备id。在计算可用设备之前,我先得到总数。请参见此处的演示:


谢谢@Gordon Linoff
SELECT * FROM equipment_return 
SELECT 
e.equip_ID, 
e.equip_Name,
u.unit_Name,
e.equip_Quantity total_Quantity,(
SELECT IF(
  ((e.equip_Quantity - eu.usage_Quantity)
   +er.return_Quantity)  IS NULL, e.equip_Quantity, (( e.equip_Quantity - eu.usage_Quantity)+er.return_Quantity))) available,
(eu.usage_Quantity - er.return_Quantity) usage_Quantity,
er.return_Quantity ,
eu.usage_ID 
FROM `equipment` e
INNER JOIN unit u ON u.unit_ID = e.unit_ID
LEFT JOIN equipment_usage eu ON eu.equip_ID = e.equip_ID
LEFT JOIN equipment_return er ON er.usage_ID = eu.usage_ID
total_equipment as total_quantity,
(total_equipment - total_usage of equipment) as available,
total_usage of equipment,
total_return of equipment
SELECT e.equip_ID, e.equip_Name,u.unit_Name,
      COALESCE(eu.usage_quantity, 0) as usage_quantity,
      COALESCE(er.return_quantity, 0) as return_quantity
FROM equipment e INNER JOIN
     unit u
     ON u.unit_ID = e.unit_ID LEFT JOIN
     (SELECT eu.equip_id, SUM(eu.usage_Quantity) as usage_Quantity
      FROM equipment_usage eu
      GROUP BY eu.equip_ID
     ) eu
     ON eu.equip_ID = e.equip_ID LEFT JOIN
     (SELECT eu.equip_id, SUM(er.return_Quantity) as return_Quantity
      FROM equipment_return er JOIN
           equipment_usage eu
           ON er.usage_ID = eu.usage_ID
      GROUP BY eu.equip_id
     ) er
     ON er.equip_ID = e.equip_ID;
SELECT equip_ID, 
equip_Name,
unit_Name,
total_Quantity, 
total_Quantity - coalesce(sum(total_usage),0) + coalesce(sum(total_return),0) as available,
sum(total_usage) as total_usage,
sum(total_return) as total_return
FROM (
SELECT 
e.equip_ID, 
e.equip_Name,
u.unit_Name,
e.equip_Quantity as total_quantity,
eu.usage_Quantity as total_usage,
sum(er.return_Quantity) as total_return,
eu.usage_ID
FROM `equipment` e
INNER JOIN unit u ON u.unit_ID = e.unit_ID
LEFT JOIN equipment_usage eu ON eu.equip_ID = e.equip_ID
LEFT JOIN equipment_return er ON er.usage_ID = eu.usage_ID
group by e.equip_ID, 
e.equip_Name,
u.unit_Name,
e.equip_Quantity,
eu.usage_Quantity,
eu.usage_ID) t
group by equip_ID, 
equip_Name,
unit_Name,
total_Quantity

Result:
equip_ID    equip_Name  unit_Name   total_Quantity  available   total_usage total_return
13  Linemen Safety Belts    set      20 20  (null)  (null)
14  3tons Lever Block       pc       30 24  13  7
15  1.5 tons Lever Block    pc       10  1  10  1
16  3/4 tons Lever Block    pc       1   1   1  1
17  5 tons Chain Block      pc       1   0   1  (null)
18  3 tons Chain Block      pc       1   1  (null)  (null)
19  Linemen Tools (pliers, wrenches, hammers)   lot 1   1   (null)  (null)
20  Extendable Ladder 21 ft. Fiberglass pc  2   2   (null)  (null)
21  Aluminum Ladder 10 ft.  pc  2   2   (null)  (null)