我正在尝试从购物车数据库生成有用的报告。
有一个表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倍。
它超出了我的掌握能力:)帮助赞赏。
答案 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的多个记录...例如,存在更高的唯一键,但可能存在具有多个状态的相同产品,类型,无论是什么导致问题。