2016-06-30 64 views
1

我有兩個表: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周SUM()在area_costs表:

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

我會得到75 00爲Syd。我想用products_shipped表中的drop_id數除以該數,這在示例數據中給出了2的計數。因此,結果應該是7500/2 = 3750.

我可以在2個查詢中執行此操作,分別得到兩個聚合,然後分割結果,但這不是一個靈活的解決方案。

我的問題是:是否有可能在一個查詢中做到這一點?

感謝您的任何答案。

+0

如果您沒有匹配的密鑰,則不需要進行計算。您似乎在兩個區域都有「區域」字段。 –

+0

「區域」不是兩個表格中的公共列嗎?如果您可以提供一些樣本數據來解釋您期望的輸出會更好 – Utsav

+0

抱歉,忘記聲明這一點 - area_costs包含的區域中的值不一定是products_shipped表中的實際區域;可悲的是,如果我將面積作爲共同的領域,我的計算就會有偏差。 – Adrian

回答

1

由於您的示例數據並未真正顯示簡單內連接可能出錯的方式,因此我選擇在單獨的子查詢中執行area_costsproducts_shipped表的兩個聚合。然後我將這兩個子查詢結合在一起以獲得最終結果。請注意,我使用了LEFT JOIN,以防中的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 
+0

感謝您的回答。當我單獨查詢area_costs表(SUM(cost))時,給出的查詢給了我相同的結果,因爲products_shipped表要大得多,當我加入區域時給了我一個更大的SUM()。我實際上試圖做的是從area_costs中獲取成本的總和(),並將其除以products_shipped中的drop_id的總COUNT()。示例:SUM()檢索的area_costs的總成本除以products_shipped的總數。這可能嗎? – Adrian

+0

用清晰的樣本輸入和所需的輸出更新您的問題。 –

+0

編輯我的問題。 – Adrian