首页 文章

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

提问于
浏览
0

Headers 令人困惑? :)

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

有一个表 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

这似乎工作正常 . 但是现在我"simply"想在报告中添加另一列显示产品名称 . 该数据位于另一个表 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倍 .

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

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的记录......例如,有一个更高的唯一键,但可能有相同的产品有多个状态,类型,等等造成这个问题 .

相关问题