I have a table Person
:
PersonID | FirstName | LastName
-------------------------------
1 | John | Doe
2 | Jane | Doe
3 | NoSpouse | Morales
4 | Jonathan | Brand
5 | Shiela | Wife
And a Relationship
table:
RelationshipID | PersonID | Type | RelatedPersonID
1 | 1 | 3 | 2
2 | 2 | 3 | 1
3 | 4 | 3 | 5
4 | 5 | 3 | 4
So basically, I want to combine the names of the spouse and client, but I want to exclude the spouse:
Expected Results:
1, John and Jane Doe, 2
----------------------
3, NoSpouse Morales, null
-----------------------
4, Jonathan and Shiela Brand, 5
I've tried:
SELECT p.PersonID,
Case when spouse.PersonID is not null
THEN p.FirstName + ' and ' + spouse.FirstName + ' ' + p.LastName
ELSE p.FirstName + ' ' + p.LastName END as ClientName,
spouse.PersonID as RelatedPersonID
FROM Person p
LEFT JOIN Relationship r on p.PersonID = r.PersonID
LEFT JOIN Person spouse on r.RelatedPersonID = spouse.PersonID
WHERE r.Type = 3 OR spouse.PersonID is null
but the results are:
1, John and Jane Doe, 2
----------------------
2, Jane and John Doe, 1
----------------------
3, NoSpouse Morales, null
-----------------------
4, Jonathan and Shiela Brand, 5
-------------------------------
5, Shiela and Jonathan Wife, 4
Here's some mock data:
create table Person(
PersonID int primary key,
FirstName varchar(max),
LastName varchar(max)
)
insert into Person values
(1, 'John', 'Doe'),
(2, 'Jane', 'Doe'),
(3, 'NoSpouse', 'Morales'),
(4, 'Jonathan', 'Brand'),
(5,'Shiela','Wife')
create table Relationship (
RelationshipID int,
PersonID int references Person(PersonID),
Type int,
RelatedPersonID int references Person(PersonID)
)
insert into Relationship values
(1, 1, 3, 2),
(2, 2, 3, 1),
(3, 4, 3, 5),
(4, 5, 3, 4)
SELECT p.PersonID,
Case when spouse.PersonID is not null
THEN p.FirstName + ' and ' + spouse.FirstName + ' ' + p.LastName
ELSE p.FirstName + ' ' + p.LastName END as ClientName,
spouse.PersonID as RelatedPersonID
FROM Person p
LEFT JOIN Relationship r on p.PersonID = r.PersonID
LEFT JOIN Person spouse on r.RelatedPersonID = spouse.PersonID
WHERE r.Type = 3 OR spouse.PersonID is null
drop table Relationship
drop table Person
thanks in advance for your help and time.
NOTE:
I've edited my mock script to include 3, NoSpouse Morales, null
in the results. Also, there is no particular criteria needed to which is husband/wife. Whoever was fetched first in the list should not include the related spouse.
If one has to be included while the other excluded, try adding a clause
AND r.PersonID < r.RelatedPersonID
since the IDs will not be equal and this will include only either one:
SELECT p.PersonID,
Case when spouse.PersonID is not null
THEN p.FirstName + ' and ' + spouse.FirstName + ' ' + p.LastName
ELSE p.FirstName + ' ' + p.LastName END as ClientName,
spouse.PersonID as RelatedPersonID
FROM Person p
LEFT JOIN Relationship r on p.PersonID = r.PersonID
LEFT JOIN Person spouse on r.RelatedPersonID = spouse.PersonID
WHERE (r.Type = 3 AND r.PersonID < r.RelatedPersonID) OR spouse.PersonID is null
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With