2014-08-28 183 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