0

标题混乱?:)

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

有一个表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_description在“products_name”列中。所以我尝试了这个:

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 倍。

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

4

1 回答 1

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 的记录......例如有更高的唯一键,但可能有相同的产品具有多种状态、类型等导致问题。

于 2013-04-16T02:42:59.200 回答