2014-08-28 191 views
1
SELECT d.mt_code, 
     d.dep_name, 
     d.service_name, 
     COUNT(*) 
FROM DepartmentService AS d 
LEFT JOIN tbl_outgoing AS t ON d.mt_code = t.depCode 
WHERE d.service_type = 'MT' 
    AND t.smsc = "mobitelMT" 
    AND t.sendDate BETWEEN '2014-07-01' AND '2014-07-02' 
GROUP BY d.mt_code 

DepartmentService表格具有關於提供服務的部門的詳細信息。 tbl_outgoing表包含由客戶完成的特定服務發生的所有事務。在WHERE條款中,應滿足service_type = 'MT' and smsc = "newMT"兩個自助餐廳。我想獲得一份報告,顯示某個特定時期內所有部門的交易情況。我使用了LEFT JOIN,因爲我想獲得所有的部門。 SQL工作正常,並得到我想要的結果,除了,LEFT JOIN不返回來自左側表格的所有記錄

如果特定時間段內沒有針對特定服務的事務,則部門也將被忽略。我想要做的是在結果集和COUNT(*)列中顯示部門爲0.

我該怎麼做?

+0

請提供一些樣品數據和要求的輸出 – 2014-08-28 09:12:32

回答

4

問題可能是您正在使用where條件過濾連接的表,它將過濾連接中沒有匹配的部門服務,移動連接中的過濾並僅保留過濾器d在where子句中:

SELECT d.mt_code, 
    d.dep_name, 
    d.service_name, 
    COUNT(t.id) 
FROM DepartmentService AS d 
LEFT JOIN tbl_outgoing AS t 
    ON d.mt_code = t.depCode 
    AND t.smsc = "mobitelMT" 
    AND t.sendDate BETWEEN '2014-07-01' AND '2014-07-02' 
WHERE d.service_type = 'MT' 
GROUP BY d.mt_code 

要解釋爲什麼發生這種情況,我會帶你通過什麼與你的查詢,並與我的查詢情況,因爲數據集我就用這個:

states 
____ _________ 
| id | state | 
| 1 | Germany | 
| 2 | Italy | 
| 3 | Sweden | 
|____|_________| 

cities 

____ ________ ___________ ____________ 
| id | city | state_fk | population | 
| 1 | Berlin |  1 |   10 | 
| 2 | Milan |  2 |   5 | 
|____|________|___________|____________| 

首先我會看看您的查詢。

SELECT s.id, s.state, c.population, c.city 
FROM states s 
LEFT JOIN cities c 
ON c.state_fk = s.id 
WHERE c.population < 10 

所以le't走一步看一步,您選擇的三種狀態,留下了城市結束了加入:

____ _________ ____________ ________ 
| id | state | population | city | 
| 1 | Germany |   10 | Berlin | 
| 2 | Italy |   5 | Milan | 
| 3 | Sweden |  NULL | NULL | 
|____|_________|____________|________| 

的您篩選使用WHERE c.population < 10人口,在這一點上你的左邊與此:

____ _________ ____________ ________ 
| id | state | population | city | 
| 2 | Italy |   5 | Milan | 
|____|_________|____________|________| 

您鬆動德國柏林,因爲人口是10 ,但你也失去了瑞典其中有NULL,如果你想保持你應該在查詢中指定它的空值:

WHERE (c.population < 10 OR IS NULL c.population) 

將返回:

____ _________ ____________ ________ 
| id | state | population | city | 
| 2 | Italy |   5 | Milan | 
| 3 | Sweden |  NULL | NULL | 
|____|_________|____________|________| 

現在我的查詢:

SELECT s.id, s.state, c.population, c.city 
FROM states s 
LEFT JOIN cities c 
ON c.state_fk = s.id 
    AND c.population < 10 

之前連接兩個,我們過濾表格城市(使用ON後的AND c.population < 10條件),剩下的是:

____ ________ ___________ ____________ 
| id | city | state_fk | population | 
| 2 | Milan |  2 |   5 | 
|____|________|___________|____________| 

因爲米蘭是人口未成年人超過10的唯一城市,現在我們可以加入兩個表:

____ _________ ____________ ________ 
| id | state | population | city | 
| 1 | Germany |  NULL | NULL | 
| 2 | Italy |   5 | Milan | 
| 3 | Sweden |  NULL | NULL | 
|____|_________|____________|________| 

正如你所看到的數據左表中停留,因爲過濾條件被應用只有到城市表。


結果取決於你想要達到的,例如,如果你想過濾德國,因爲柏林有人口輕微高於10並保持瑞典,你應該使用第一種方法添加IS NULL條件是什麼套的變化,如果你想要保留它,你應該使用第二種方法,並在左連接右側預過濾表格。

+0

+1是的,正是這個問題。你能否更多地解釋答案,以便我能理解並接受它。 – Techie 2014-08-28 09:15:30

+0

我做了一個編輯,希望它很清楚,如果不是,我會稍後再編輯,不幸的是我現在沒有太多時間。 – 2014-08-28 09:25:19

+0

即使沒有交易COUNT(*)顯示爲1,它應該是0. – Techie 2014-08-28 09:27:25

相關問題