Je pensais à une vue/requête complexe que je devais créer, mais je n'arrive pas à trouver une bonne solution (ou une solution de travail) à mon problème. D'abord, je vais vous donner un morceau de ma structure de base de données pour expliquer mon problème:Vue compliquée de SQL Server 2008 R2
Chaque accord a généralement 3 personnes impliquées: un client, un endclient et un ContactPerson. Ces types de rôle sont définis dans la table PersonAgreementInvolvementRole. Ce que je veux est de créer une vue où je peux obtenir les trois noms de personnes impliquées dans l'accord, donc quelque chose comme ceci:
AgreementID | ClientName | EndClientName | ContactPersonName
1 | Company1 | Company2 | Smith
Parce que je dois aller à la même table (personne) à chaque fois pour obtenir le nom de la personne impliquée, je ne sais pas comment je peux le faire le mieux. J'ai d'abord essayé quelque chose comme ceci:
select ag.StartDate, ag.EndDate, ag.PriceRate, ag.TaskDescription, pc.Name as ClientName, pec.Name as EndClientName
from dbo.Agreement ag inner join dbo.PersonAgreementInvolvement pai
on ag.AgreementID = pai.AgreementID
inner join dbo.Person pc
on pai.PersonID = pc.PersonID
inner join dbo.PersonAgreementInvolvementRole pairc
on pai.PersonAgreementInvolvementRoleID = pairc.PersonAgreementInvolvementRoleID
inner join dbo.Person pec
on pai.PersonID = pec.PersonID
inner join dbo.PersonAgreementInvolvementRole pairec
on pai.PersonAgreementInvolvementRoleID = pairec.PersonAgreementInvolvementRoleID
where pairec.Value = 'Client'
and
pairc.Value = 'EndClient'
mais cela ne fonctionne pas (il est revenu aucune donnée), après que j'ai essayé une requête avec un syndicat mais aussi n'a pas fonctionné.
L'un de vous a une idée? Plus d'informations peuvent être fournies si nécessaire, il suffit de demander!
données Exemple:
J'ai un accord (AgreementID = 1) avec deux personnes impliquées. Il y a une personne avec le nom "Google" qui a l'InvolvementRole "Client" et une autre personne nommée "Microsoft" qui a l'InvolvementRole "EndClient". Ce que je voudrais obtenir de ma requête est la suivante:
AgreementID - Client - EndClient
-------------------- -----------------
1 Google Microsoft
EDIT: RESOLU! En fin de compte, cette requête a fait le travail:
SELECT ag.StartDate, ag.EndDate, ag.PriceRate, CAST(ag.TaskDescription AS VARCHAR(8000)),
MIN(CASE WHEN pair.Value = 'Klant' THEN pc.Name END) as Klant,
MIN(CASE WHEN pair.Value = 'Eindklant' THEN pc.Name END) as Eindklant,
MIN(CASE WHEN pair.Value = 'ContactPerson' THEN pc.Name END) as ContactPersonName
FROM dbo.Agreement ag
INNER JOIN dbo.PersonAgreementInvolvement pai
ON ag.AgreementID = pai.AgreementID
inner join dbo.PersonAgreementInvolvementRole pair
on pai.PersonAgreementInvolvementRoleID = pair.PersonAgreementInvolvementRoleID
LEFT JOIN dbo.Person pc
ON pai.PersonID = pc.PersonID
GROUP BY ag.StartDate, ag.EndDate, ag.PriceRate, CAST(ag.TaskDescription AS VARCHAR(8000))
Merci à tous ceux qui m'ont aidé à le résoudre! :)
"SQL Server Complicated" devrait être une alternative à "SQL Server Compact" :) Merci – MatBailie