sql。将行返回为列

标签 sql sql-server

我有一个 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/

相关文章:

php - 使用 PHP 在表单中创建流水号

sql - MySQL按最大值分组

sql - 两个查询。相同的输出。一个需要2小时,另一个需要0秒。为什么?

c# - 插入空值或小数

SQL语句-更新两个表

mysql - 如何选择一列中与其他列的单个值匹配的值组合的计数?

c# - 如何使用 App.config 连接 C# 和 Db?

SQL Server 数据库注入(inject)

mysql - 这个数据库是3NF吗?

c# - 如何计算嵌套类别中项目的总数(自引用类别表)