2014-08-28 9 views
2

我嘗試加入3個表是這樣的:加入與查詢SQL 3個表

表1:國家

Id | Country 
------------------- 
1 | UK 
2 | USA 
3 | France 

表2:日期

Id  | Date 
----------------- 
20000101 | 2000-01-01 
20000102 | 2000-01-02 
... 
20140901 | 2014-09-01 

表3:客戶

Id | Customer | Date_Creation_Id | Country_Id 
--------------------------------------------- 
1  | AAA  | 20000102   | 1 
2  | B   | 20000102   | 2 
2  | CC   | 20000103   | 2 

我想找到nu所有日期和所有國家的新客戶。

Date  | Country | number of creation 
------------------------------------------------- 
20000101 | UK  | 0 
20000101 | USA  | 0 
20000101 | France | 0 

20000102 | UK  | 1 
20000102 | USA  | 2 
20000102 | France | 0 

20000103 | UK  | 0 
20000103 | USA  | 1 
20000103 | France | 0 

我嘗試此查詢

select count(*) as count,Customer.Date_Creation_Id, Customer.Country_Id 
from customer 
Right join Date on Dates.Id = Customer.Date_Creation_Id 
Right join Country on Country.Id = Customer.Country_Id 
group by Customer.Date_Creation_Id, Customer.Country_Id 

但我不知道所有日期與它

回答

1
SELECT  D.Id,C.Country,COUNT(CU.Id) [number of creation] 
FROM  Country C CROSS JOIN [Date] D 
LEFT JOIN customer CU on D.Dates.Id = CU.Date_Creation_Id And C.Country.Id = CU.Country_Id 
GROUP BY D.Id,C.Country 
ORDER BY D.Id,C.Id 
4

您需要首先生成所有國家和日期列表,使用cross join和然後left join數據:

select d.id as date_id, c.id as country_id, count(cu.id) as cnt 
from dates d cross join 
    country c left join 
    customers cu 
    on cu.date_creation_id = d.id and cu.country_id = c.id 
group by d.id, c.id 
order by d.id, c.id; 
1

與您的查詢的問題是,你是這可能是空列分組後right joinCustomer.Date_Creation_IdCustomer.Country_Id

的解決方案是使用的列從你的維CountryDates

select count(*) as count, Dates.Id Date_Creation_Id, Country.Id Country_Id 
from customer 
Right join Date on Dates.Id = Customer.Date_Creation_Id 
Right join Country on Country.Id = Customer.Country_Id 
group by Dates.Id, Country.Id