2010-03-22 170 views
2

我有以下表,Persons_Companies,這顯示了這些人的個人和公司的已知,之間的關係:SQL簡單的查詢

PersonID | CompanyID 

    1    1 
    2    1 
    2    2 
    3    2 
    4    2 

想象公司1 =「谷歌」和公司2 =「微軟」 ,我想知道查詢有以下結果:

PersonID | Microsoft | Google 

    1    0    1 
    2    1    1 
    3    1    0 
    4    1    0 

直到這一刻我有類似的東西:

select PersonID, 
case when CompanyID=1 then 1 else 0 
end as Google, 
case when EmpresaID=2 then 1 else 0 
end as Microsoft 
from Persons_Companies 

我的問題是與兩個公司都知道的人,我無法想象這個查詢怎麼可能。

什麼是SQL查詢?

回答

4
select PersonID, 
case when EXISTS (
    SELECT 1 
    FROM Persons_Companies pc1 
    WHERE pc.PersonID = pc1.PersonID and pc1.CompanyID = 1) then 1 else 0 
end as Google, 
case when EXISTS (
    SELECT 1 
    FROM Persons_Companies pc2 
    WHERE pc.PersonID = pc2.PersonID and pc2.CompanyID = 2) then 1 else 0 
end as Microsoft 
from Persons_Companies pc 
+0

非常感謝。 最好的問候。 何塞 – Sosi 2010-03-22 15:14:46

1
SELECT personId, sum(case companyId when 1 then 1 else 0 end) google, 
     sum(case companyId when 2 then 1 else 0 end) microsoft 
from Persons_Companies 
group by personId 
order by personId; 
+0

這基本上是我剛纔提出的建議,只是稍微簡單一點。 :) – Guffa 2010-03-22 15:15:26

0

沒有與兩個答案的問題,因爲有一個假設,即谷歌和微軟將永遠是餐桌上的唯一公司。我相信查詢應該是通用的。

我不太確定,但我認爲cross tabCTE的組合可以很好地工作。

1

我想這是你想要什麼:http://pastie.org/881092

select 
p.person_id, 
if(ms.company_id is null,0,1) as 'microsoft', 
if(ora.company_id is null,0,1) as 'oracle', 
if(mysql.company_id is null,0,1) as 'mysql' 
from 
person p 
left outer join person_company ms on p.person_id = ms.person_id and ms.company_id = 1 
left outer join person_company ora on p.person_id = ora.person_id and ora.company_id = 2 
left outer join person_company mysql on p.person_id = mysql.person_id and mysql.company_id = 3 
order by 
p.person_id;