多个内部联接以获取复杂的报告,而不是工作

时间:2012-08-24 02:41:37

标签: mysql join report

对于下面的架构,我需要获取此报告

这就是我所拥有的

select c.name, sr.name, count(o.order_id)
from contact c 
INNER JOIN accounts a
ON c.account_id=a.account_id
INNER JOIN sales_reps sr 
ON a.sales_rep_id =sr.sales_rep_id
INNER JOIN orders o
ON a.account_id =o.account_id
where o.order_id in (
    select SUM(oi.quantity*p.price) from 
    order_items oi INNER JOIN parts p
    on oi.part_id =p.part_id
)
group by a.account_id, c.name

但这并没有给出任何结果。

请帮忙。

3 个答案:

答案 0 :(得分:3)

它不会给你的结果提供结果... IN SELECT基于一个返回sum()值的查询,该值不等于键(最有可能),或者最多不正确......并且因为你是处理具有小数精度(通常)的数量和价格,你甚至不会得到那个甚至很少匹配...

我会交换查询以在给定日期内对订单进行资格预审并总结......然后加入休息......

select
         c.name, 
         sr.name,
         PreQualified.NumberOrders,
         PreQualified.OrderTotal
      from
         ( select 
                 o.Account_ID,
                 count( distinct o.order_id ) as NumberOrders,
                 sum( oi.quantity * p.price ) as OrderTotal
              from 
                 orders o
                    join order_items oi
                       on o.order_id = oi.order_id
                       join parts p
                          on oi.part_id = p.part_id
              where
                 o.Delivery_Date >= CURDATE()
              group by
                 o.Account_ID ) as PreQualified
            JOIN Accounts a
               on PreQualified.Account_ID = a.Account_ID
               Join Contact C
                  on a.Account_ID = c.Account_ID
            JOIN Sales_Reps sr
               ON a.sales_rep_id = sr.sales_rep_id 

答案 1 :(得分:3)

你的情况不对,order_id应该如何等于一笔金额?

尝试以下方法:

select 
    c.name, sr.name, COUNT(o.order_id), SUM(op.order_total)
FROM 
    contact c 
INNER JOIN 
    accounts a ON c.account_id = a.account_id
INNER JOIN 
    sales_reps sr ON a.sales_rep_id = sr.sales_rep_id
INNER JOIN 
    orders o ON a.account_id = o.account_id
INNER JOIN 
  (SELECT 
      oi.order_id, SUM(oi.quantity * p.price) AS order_total
  FROM 
      order_items oi 
  INNER JOIN 
      parts p ON oi.part_id = p.part_id 
  GROUP BY 
      oi.order_id
  ) op ON o.order_id = op.order_id
WHERE o.delivery_data >= CURDATE()
GROUP by c.contact_id

答案 2 :(得分:0)

如果要计算记录,请使用

count(*)

而不是

count(o.order_id)