2010-03-22 169 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;