2013-04-15 108 views
0

标题混淆? :)来自2个表的SQL连接,从第三个连接的数据分组

我试图从我的购物车数据库中生成有用的报告。

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

第二个表,orders_products,具有相同的“orders_id”键并有关于命令的信息。特别是,我对“products_id”,“products_quantity”和“final_price”感兴趣

我想要做的是生成销售报表,显示数量*价格的总和,并在date_ordered为两个日期。我可以这样做:

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倍的东西。

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

+0

尝试在group by子句 –

+0

中添加pd.products_name如果产品ID的数字乘以3,我猜这是因为products_description表包含相同产品ID的3行,不是吗? – Walid

+0

@Nikita ......奇怪的是,这使服务器崩溃!大声笑。我尝试重新启动并重新执行,同样的事情......它冻结。 WEIRD – bcsteeve

回答

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的记录...例如存在较高的唯一性键,但可能存在具有多个状态的相同产品,类型,不管是什么原因造成的。

+0

感谢您向我展示PreQuery ...全新的概念。正如我在评论中提到的,你们是对的,在products_description中有三重条目。所以我很烦恼自己没有看到它,并浪费你的时间......但我很高兴,因为我看到了一种新的做事方式!谢谢。 – bcsteeve