2015-02-08 26 views
1

我有這個查詢,有三個表(發票,customer_addresses,國家),我想返回每個國家的銷售數量,有些國家沒有銷售,所以我想返回零作爲sales_count以外的其他排除它們從結果。如何使用計數函數連接三個表以返回零結果?

SELECT c.name,c.iso_code,c.id as country_id, COUNT(*) as sales_count ,SUM(a.total_due) as gross 
     FROM `invoices` a 
      JOIN `customer_addresses` b 
      ON b.`customer_id` = a.`customer_id` 
      JOIN `countries` c 
      ON c.`id` = b.`country_id` 
     WHERE a.`status` = 'Paid' AND a.`deleted` ='No' 
     GROUP BY c.name 

樣本數據:

發票

id | total_due | customer_id 
1 | 25  |  5 
2 | 45  |  7 

customer_addresses

id | address | customer_id | country_id 
5 | some address | 1   | 3 
7 | some address | 2   | 4 

個國家

id |  name  | iso_code 
3 | USA   | US 
4 | United Kingdom | UK 
5 | France   | Fr 
+0

在詢問sql查詢問題時,包含示例數據和所需結果總是明智的。是否應該將在多個國家有地址的客戶的銷售計入每個國家? – wvdz 2015-02-08 21:00:32

+0

@popovitsj我添加了示例數據,因爲您可以在「customer_addresses」表中看到「France」沒有引用,所以我的查詢沒有返回結果,我也想包括法國,用sales_count = 0 – 2015-02-08 21:09:30

回答

1

你可以使用一個right join代替(inner) join,但它已不常用,它通常被認爲是可讀的甚少。

因此,您可以使用left join作爲表格,並使country成爲第一個表格。使用left join,即使連接表中沒有匹配的行,仍然會得到結果。撥打count的電話也稍有改動。 count(*)將只返回行數,因此無回票的國家將返回1count(invoice_id)只計算那些行數invoice_id is not null,因此對於沒有銷售額的國家/地區將返回0

SELECT 
    c.name, c.iso_code, c.id as country_id, 
    COUNT(a.invoice_id) as sales_count, 
    SUM(a.total_due) as gross 
FROM 
    `countries` c 
    LEFT JOIN `customer_addresses` b 
    ON c.`id` = b.`country_id` 
    LEFT JOIN `invoices` a 
    ON b.`customer_id` = a.`customer_id` 
    AND a.`status` = 'Paid' 
    AND a.`deleted` ='No' 
GROUP BY c.name 
+0

我只是嘗試了它,不幸的是它沒有奏效,仍然沒有返回銷售額爲零的國家。 – 2015-02-08 21:26:26

+0

你說得對。我犯了一個愚蠢的錯誤。 WHERE子句中的條件也應該在連接中,否則這些國家仍然被排除在外。我現在修復了查詢。 – GolezTrol 2015-02-08 21:43:48

+0

作爲魅力工作,謝謝:) – 2015-02-08 22:10:12