2010-03-22 4 views
2

я следующая таблица, Persons_Companies, который показывает соотношение между лицами и компаниями knowns этими лицами:SQL простой запрос

PersonID | CompanyID 

    1    1 
    2    1 
    2    2 
    3    2 
    4    2 

воображая, что компания 1 = «Google» и компания 2 является = «Microsoft» Я хотел бы знать запрос, чтобы иметь следующий результат:

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

Спасибо большое. С наилучшими пожеланиями. Jose – Sosi

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

0

Существует проблема с обоих ответов, потому что есть предположение, что Google и Microsoft всегда будут единственными компаниями на столе. Я считаю, что запрос должен быть общим.

Я не слишком уверен, но я думаю, что комбинация cross tab и CTE будет работать хорошо.

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;