2016-12-09 75 views
0

我正在嘗試查詢將返回0 COUNT以及我的新兵月月之間的銷售總數。如何在使用WHERE時將「零」/「0」結果放入COUNT?

SELECT recruits.pin, recruits.first_name, recruits.surname, sales.sale_date, 
COUNT(sales.pin) AS 'TotalSales' FROM sales 
LEFT JOIN recruits ON sales.pin = recruits.pin 
WHERE sales.sale_date BETWEEN '$sYear1-$sMonth1-01' AND '$sYear2-$sMonth2-31' 
AND recruits.country = '$sCountry' 
GROUP BY recruits.pin 
ORDER BY COUNT(sales.pin) DESC; 

這隻會輸出所選月份的總銷售數量。並且不顯示任何0值,並且不會顯示所有新兵。 如果我刪除WHERE語句,它將輸出所有新兵,但它不會按月過濾,因此我無法按月清除銷售數量。

任何幫助將不勝感激。

+0

在日期之間沒有銷售(sales.pin),這就是爲什麼你沒有看到它們列出。 – TeaTime

+0

使FROM從Recruits和LEFT JOIN銷售中獲得。 然後..COUNT(COALESCE(sales.PIN,0)) – AntDC

回答

0

您需要在recruits移動狀態的on條款。但是如果你想全部新兵(按國家過濾),那麼recruits應該是LEFT JOIN中的第一個表格。

我會寫爲:

SELECT r.pin, r.first_name, r.surname, s.sale_date, 
     COUNT(s.pin) AS TotalSales 
FROM recruits r LEFT JOIN 
    sales s 
    ON s.pin = r.pin AND 
     s.sale_date BETWEEN '$sYear1-$sMonth1-01' AND '$sYear2-$sMonth2-31' 
WHERE r.country = '$sCountry' 
GROUP BY r.pin 
ORDER BY COUNT(s.pin) DESC; 

注:

  • 表的別名使查詢更易於讀取和寫入。
  • 正常情況下,您希望在GROUP BY中包含所有未集合的列。據推測,pinrecruits中的主鍵/唯一鍵,所以這是一種情況,其中不包括列是好的。
  • sale_date(第二張表)的條件應該在on條款中。
  • country(第一張表)的條件應該在where條款中。
+0

這工作了一個治療:) –

0

這是因爲我會說where條款。您還應該反轉銷售和招聘。先把所有招聘人員加入銷售。如果sales.id(選擇正確的列名稱)爲空或銷售在期間,嘗試通過測試包含所有新員工。

SELECT recruits.pin, recruits.first_name, recruits.surname, sales.sale_date, 
SUM(COALESCE(sales.Total,0)) AS 'TotalSales' FROM recruits 
LEFT OUTER JOIN sales ON sales.pin = recruits.pin 
WHERE sales.pin IS NULL OR sales.sale_date BETWEEN '$sYear1-$sMonth1-01' AND '$sYear2-$sMonth2-31' 
AND recruits.country = '$sCountry' 
GROUP BY recruits.pin 
ORDER BY COUNT(sales.pin) DESC; 
+0

'新兵。「Id」'? – RiggsFolly

+0

是的,無論哪個字段不能爲空。我把它改成了[pin] – asfez

+0

這已經做了一些改變。但它仍然不正確。我得到一個沒有銷售額的招聘人數爲1。 –

相關問題