-1

叹息......有人可以帮忙吗?在下面的 SQL 查询中,我得到的结果不正确。[LaborDetail] 中有三 (3) 个劳动记录

  • 小时/费用
  • 2.75 / 50.88
  • 2.00 / 74.00
  • 1.25 / 34.69

[WorkOrderInventory] ​​中有两 (2) 个物料记录

  • 材料费用
  • 42.75
  • 35.94

问题是查询错误地返回以下内容:

sFunction      cntWO    sumLaborHours   sumLaborCost    sumMaterialCost
ROBOT HARNESS   1         12              319.14              236.07

我在导致总和相乘的查询中做错了什么?正确的值是 sumLaborHours = 6、sumLaborCost = 159.57 和 sumMaterialCost = 78.69。谢谢您的帮助。

SELECT CASE WHEN COALESCE(work_orders.location, Work_Orders_Archived.location) IS NULL
    THEN '' ELSE COALESCE(work_orders.location, Work_Orders_Archived.location) END AS sFunction,
(SELECT COUNT(*)
    FROM work_orders
        FULL OUTER JOIN Work_Orders_Archived
        ON work_orders.order_number = Work_Orders_Archived.order_number
    WHERE COALESCE(work_orders.order_number, Work_Orders_Archived.order_number) = '919630') AS cntWO,
SUM(Laborhours) AS sumLaborHours,
SUM(LaborCost) AS sumLaborCost,
SUM(MaterialCost*MaterialQuanity) AS sumMaterialCost
FROM work_orders
    FULL OUTER JOIN Work_Orders_Archived
    ON work_orders.order_number = Work_Orders_Archived.order_number
    LEFT OUTER JOIN
        (SELECT HoursWorked AS Laborhours, TotalDollars AS LaborCost, WorkOrderNo
            FROM LaborDetail) AS LD
            ON COALESCE(work_orders.order_number, Work_Orders_Archived.order_number) = LD.WorkOrderNo
    LEFT OUTER JOIN
        (SELECT UnitCost AS MaterialCost, Qty AS MaterialQuanity, OrderNumber
            FROM WorkOrderInventory) AS WOI
            ON COALESCE(work_orders.order_number, Work_Orders_Archived.order_number) = WOI.OrderNumber
WHERE COALESCE(work_orders.order_number, Work_Orders_Archived.order_number) = '919630'
GROUP BY CASE WHEN COALESCE(work_orders.location, Work_Orders_Archived.location) IS NULL
        THEN '' ELSE COALESCE(work_orders.location, Work_Orders_Archived.location) END
ORDER BY sFunction
4

3 回答 3

1

像这样完全连接到“WorkOrderInventory”时,尝试在派生表子查询中使用 SUM 函数......

select 
...  
 sum(hrs) as sumlaborhrs, 
 sum(cost) as sumlaborcost, 
 -- calculate material cost in subquery 
 summaterialcost
from labordetail a
full outer join 
 (select ordernumber, sum(materialcost) as summaterialcost
  from WorkOrderInventory 
  group by ordernumber
 ) b on a.workorderno = b.ordernumber

我创建了一个简单的sql fiddle来演示这一点(为了示例,我简化了您的查询)

于 2013-06-03T18:43:24.977 回答
0

最好的猜测是工单在其中一张表中出现了不止一次。尝试这些查询来检查两个最明显的候选表中的重复项:

select cnt, COUNT(*), MIN(order_number), MAX(order_number)
from (select order_number, COUNT(*) as cnt
      from work_orders
      group by order_number
     ) t
group by cnt
order by 1;

select cnt, COUNT(*), MIN(order_number), MAX(order_number)
from (select order_number, COUNT(*) as cnt
      from work_orders_archived
      group by order_number
     ) t
group by cnt
order by 1;

如果任一返回cnt不是 1 的行,则表中有重复项。

于 2013-06-03T18:27:32.660 回答
0

在我看来,它work_orders包含work_orders_archived相同的东西,你需要两张桌子,就好像它们是一张桌子一样。因此,您可以代替加入创建一个UNION并像使用一张表一样使用它:

select location as sfunction
from
(select location
  from work_orders
union  location
  from work_orders_archived)

然后你用它来加入其余的。你在什么数据库管理系统上?你可以使用WITH. 但这在 MYSQL 上不存在。

with wo as 
(select location as sfunction, order_number
  from work_orders
union  location, order_number
  from work_orders_archived)
select sfunction,
count(*) 
SUM(Laborhours) AS sumLaborHours,
SUM(LaborCost) AS sumLaborCost,
SUM(MaterialCost*MaterialQuanity) AS sumMaterialCost
from wo
    LEFT OUTER JOIN
        (SELECT HoursWorked AS Laborhours, TotalDollars AS LaborCost, WorkOrderNo
            FROM LaborDetail) AS LD
            ON COALESCE(work_orders.order_number, Work_Orders_Archived.order_number) = LD.WorkOrderNo
    LEFT OUTER JOIN
        (SELECT UnitCost AS MaterialCost, Qty AS MaterialQuanity, OrderNumber
            FROM WorkOrderInventory) AS WOI
            ON COALESCE(work_orders.order_number, Work_Orders_Archived.order_number) = WOI.OrderNumber
where wo.order_number = '919630'
group by sfunction
order by sfunction
于 2013-06-03T18:37:32.510 回答