2010-03-22 4 views
2

J'ai le tableau suivant, Persons_Companies, qui montre une relation entre les personnes et les entreprises knowns par ces personnes:SQL requête simple

PersonID | CompanyID 

    1    1 
    2    1 
    2    2 
    3    2 
    4    2 

Imagining cette société 1 = "Google" et l'entreprise 2 est = "Microsoft" Je voudrais savoir la requête pour avoir le résultat suivant:

PersonID | Microsoft | Google 

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

Jusqu'à ce moment, j'ai quelque chose de similaire:

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 

Mon problème est avec les personnes qui connaissent les deux sociétés, je ne peux pas imaginer comment cette requête pourrait être.

Quelle est la requête SQL?

Répondre

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

Merci beaucoup. Cordialement. 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

C'est en gros ce que j'étais sur le point de suggérer, seulement un peu moins compliqué. :) – Guffa

0

Il y a un problème avec les deux réponses, parce qu'il ya une hypothèse que Google et Microsoft seront toujours les seules entreprises sur la table. Je crois que la requête devrait être générique.

Je ne suis pas sûr mais je pense qu'une combinaison d'un cross tab et CTE fonctionnera bien.

1

Je pense que c'est ce que vous voulez: 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;