【问题标题】:Aggregate data and JOIN two tables without corresponding key聚合数据并 JOIN 两个没有对应键的表
【发布时间】:2016-06-30 04:03:47
【问题描述】:

我有两个表: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|
-----------------------------------------------------

假设我在 area_costs 表中的第 20 周执行 SUM():

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

我将为 Syd 获得 7500。我想将它除以 products_shipped 表中的 drop_id 数,在示例数据中,我的计数为 2。因此,结果应该是 7500 / 2 = 3750。

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

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

感谢您的任何回答。

【问题讨论】:

  • 如果您没有匹配的密钥,则无需进行计算。您似乎在两者中都有一个“区域”字段。
  • area 不是两个表中的公共列吗?如果您可以提供一些示例数据来解释您期望的输出会更好
  • 抱歉,忘了说明 - area_costs 包含的区域中的值不一定是 products_shipped 表中的实际区域;遗憾的是,如果我使用面积作为公共字段,我的计算就会有偏差。
  • @Adrian - 您必须提供一些示例数据以及您对输出的期望。
  • @Utsav 我正在尝试获取 area_costs 的总 SUM() ,然后将其除以 products_shipped 表中的下降总数。我可以在 2 个查询中做到这一点,基本上是从 area_costs 中获取 SUM() 和 drop 的 COUNT(),然后将其划分。这可能在 1 个查询中实现吗?

标签: mysql sql


【解决方案1】:

因为您的示例数据并没有真正说明简单的内部联接如何出错,所以我选择在单独的子查询中对 area_costsproducts_shipped 表进行两次聚合。然后我将这两个子查询连接在一起以获得最终结果。请注意,我使用了LEFT JOIN,以防area_costs 中的areaproducts_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

【讨论】:

  • 感谢蒂姆的回答。当我只查询 area_costs 表 (SUM(cost)) 时,给出的查询给了我相同的结果,因为 products_shipped 表要大得多,当我加入 area 时给我一个更大的 SUM()。我基本上尝试做的是从 area_costs 中获取总成本 SUM(),然后除以 products_shipped 中 drop_id 的总 COUNT()。示例:由 SUM() 检索的 area_costs 的总成本然后除以 products_shipped 的总数。这可能吗?
  • 用清晰的示例输入和所需的输出更新您的问题。
  • 编辑了我的问题。
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 2017-08-15
  • 2019-01-28
  • 2017-10-26
  • 2023-02-06
  • 1970-01-01
  • 2022-12-15
相关资源
最近更新 更多