聚合数据和JOIN两个表没有相应的键

时间:2016-06-30 04:03:47

标签: mysql sql

我有两个表:area_costs和products_shipped。

area_costs包含每个区域的费用,即快递费用,运输费用。

---------------------
|year|week|area|cost|
---------------------

表products_shipped包含发送给客户的所有产品:

-------------------------------------------------------
|product_id|area|customer_id|drop_id|date_id|product_price|
-------------------------------------------------------

现在如上所述,没有匹配的键来连接这些表。我想进行一项计算,该计算主要取每个区域的成本,并将其除以每个区域的下降数,以获得每次下降的平均花费。如果所有信息都在一个表中可用,我可能会输入:

SELECT area, SUM(cost) / COUNT(drop_id) AS spent_per_drop FROM full_table GROUP by AREA

有没有办法用提供的信息做到这一点?

示例数据:

area_costs:

---------------------
|year|week|area|cost|
|2016|20  |mel |5000|
|2016|20  |syd |7500|
|2016|20  |bri |3000|
|2016|21  |mel |5200|
|2016|21  |syd |7400|
---------------------

products_shipped:

-----------------------------------------------------
|product_id|area|customer_id|drop_id       |date_id |
|515       |syd |100        |515-syd-100-01|20160607|
|515       |syd |102        |515-syd-102-12|20160607|
|508       |mel |103        |508-mel-103-03|20160607|
-----------------------------------------------------

让我们说我在第20周在area_costs表中做了一个SUM():

SELECT area, SUM(cost_actual) FROM area_costs GROUP BY area

我将获得7500的Syd。我想把它除以products_shipped表中drop_id的数量,它在样本数据中给出了2的计数。因此,结果应该是7500/2 = 3750.

我可以在2个查询中执行此操作,分别获取两个聚合,然后划分结果,但这不是一个灵活的解决方案。

我的问题是:是否可以在一个查询中执行此操作?

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

由于您的示例数据并未真正演示简单内部联接可能出错的原因,因此我选择在单独的子查询中对area_costsproducts_shipped表进行两次聚合。然后我将这两个子查询连接在一起以获得最终结果。请注意,如果LEFT JOIN中的areaarea_costs中没有任何条目,我会使用products_shipped。在这种情况下,我会显示NA每次丢弃统计信息。

SELECT t1.area,
    CASE WHEN t2.drop_count IS NULL
         THEN "NA"
         ELSE CAST((t1.cost_sum / t2.drop_count) AS VARCHAR)
    END AS spent_per_drop
FROM
(
    SELECT area, SUM(cost_actual) AS cost_sum
    FROM area_costs
    GROUP BY area
) t1
LEFT JOIN
(
    SELECT area, COUNT(*) AS drop_count
    FROM products_shipped
    GROUP BY area
) t2
    ON t1.area = t2.area