SQL连接来自2个表,按来自第三个表的连接数据进行分组

时间:2013-04-15 23:22:03

标签: mysql join

标题令人困惑? :)

我正在尝试从购物车数据库生成有用的报告。

有一个表orders,其中包含“date_ordered”(以及其他一些我不关心的东西)和一个键“orders_id”

第二个表orders_products具有相同的“orders_id”键,并且包含有关订购内容的信息。特别是,我对“products_id”,“products_quantity”和“final_price”感兴趣

我想要做的是生成一份销售报告,显示数量*价格的总和,并在date_ordered在两个日期之间时按products_id分组。我可以这样做:

SELECT op.products_id AS 'PID',
    SUM(op.products_quantity) AS 'sales Q',
    SUM(op.final_price * op.products_quantity) AS 'sales $'
FROM orders o
JOIN orders_products op
ON o.orders_id = op.orders_id
WHERE o.date_purchased
BETWEEN '2012-01-01' AND '2012-12-31'
GROUP BY op.products_id

这似乎工作正常。但现在我“只是”想在报告中添加另一列,显示产品名称。该数据位于“products_name”列中的另一个表products_description中。所以我尝试了这个:

SELECT pd.products_name AS 'Product',
    op.products_id AS 'PID',
    SUM(op.products_quantity) AS 'sales Q',
    SUM(op.final_price * op.products_quantity) AS 'sales $'
FROM orders o
JOIN orders_products op
ON o.orders_id = op.orders_id
JOIN products_description pd
ON op.products_id = pd.products_id
WHERE o.date_purchased
BETWEEN '2012-01-01' and '2012-12-31'
GROUP BY op.products_id

起初它似乎有效,直到我注意到所有销售Q和销售额数字都是应有的3倍。

它超出了我的掌握能力:)帮助赞赏。

1 个答案:

答案 0 :(得分:1)

另一件事......正如其他人注意到将产品名称添加到group by子句中,您似乎仍然有某种笛卡尔结果。在不知道实际数据的情况下,您可能希望将查询包装起来像......

select
      pd.products_name AS 'Product',
      PreQuery.*
   from
      ( SELECT 
              op.products_id AS 'PID',
              SUM(op.products_quantity) AS 'sales Q',
              SUM(op.final_price * op.products_quantity) AS 'sales $'
           FROM 
              orders o
                 JOIN orders_products op
                    ON o.orders_id = op.orders_id
           WHERE 
              o.date_purchased BETWEEN '2012-01-01' and '2012-12-31'
           GROUP BY 
              op.products_id ) PreQuery
      JOIN products_description pd
         ON PreQuery.PID = pd.products_id

这应该有效,因为内部查询只会在PID上汇总结果。然后,获取结果并加入产品描述表。

如果您仍然为每个项目获取重复项,那么您的产品描述表似乎会有相同产品ID的多个记录...例如,存在更高的唯一键,但可能存在具有多个状态的相同产品,类型,无论是什么导致问题。