我有两个表: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个查询中执行此操作,分别获取两个聚合,然后划分结果,但这不是一个灵活的解决方案。
我的问题是:是否可以在一个查询中执行此操作?
感谢您的回答。
答案 0 :(得分:1)
由于您的示例数据并未真正演示简单内部联接可能出错的原因,因此我选择在单独的子查询中对area_costs
和products_shipped
表进行两次聚合。然后我将这两个子查询连接在一起以获得最终结果。请注意,如果LEFT JOIN
中的area
在area_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