我有一个 Person 表。 每个人在 PersonNames 表中可以有多个名字。 我想将每个人的 2 个名字和 2 个姓氏排成一行。 像这样:
PersonId | FName1 | Fname2 | Lname1 | Lname2
1 David Daniekl Bekernman Stivens
人员表:
PersonId
BirthDate
PersonNames 表:
PersonId
NameId
Name
NameType (e.g; first, last...)
谢谢。
最佳答案
如果这专门仅用于两个姓名,则这将选取每个人具有 MIN 和 MAX NameId 的姓名...
SELECT
Person.PersonId,
MAX(CASE WHEN Name.nameId = map.minNameId AND Name.nameType = 'first' THEN Name.Name ELSE NULL END) AS fname1,
MAX(CASE WHEN Name.nameId = map.minNameId AND Name.nameType = 'last' THEN Name.Name ELSE NULL END) AS lname1,
MAX(CASE WHEN Name.nameId = map.maxNameId AND Name.nameType = 'first' THEN Name.Name ELSE NULL END) AS fname2,
MAX(CASE WHEN Name.nameId = map.maxNameId AND Name.nameType = 'last' THEN Name.Name ELSE NULL END) AS lname2
FROM
Person
LEFT JOIN
(SELECT personId, MIN(nameId) AS minNameId, MAX(nameId) as maxNameId FROM PersonNames GROUP BY PersonId) AS map
ON map.PersonId = Person.PersonId
LEFT JOIN
PersonNames AS Name
On Name.PersonId = Person.PersonId
GROUP BY
Person.PersonId
编辑
既然我可以看到这是 MS SQL Server,那么还有另一个选择。与这里的其他人类似,但可能稍微简单一些......
WITH
sequenced_names AS
(
SELECT
DENSE_RANK() OVER (PARTITION BY PersonId ORDER BY NameID) AS NameOrdinal,
*
FROM
PersonNames
)
SELECT
PersonID,
MAX(CASE WHEN nameOrdinal = 1 AND nameType = 'first' THEN Name END) AS fname1,
MAX(CASE WHEN nameOrdinal = 1 AND nameType = 'last' THEN Name END) AS lname1,
MAX(CASE WHEN nameOrdinal = 2 AND nameType = 'first' THEN Name END) AS fname2,
MAX(CASE WHEN nameOrdinal = 2 AND nameType = 'last' THEN Name END) AS lname2
FROM
sequenced_names
GROUP BY
PersonID
关于sql。将行返回为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776402/