将多个列值作为新行SQL返回

时间:2013-04-26 20:06:39

标签: sql sql-server-2008

我有一个表格,显示每个员工,并列出他们申请的职位作为单独的列。

APPNO, Date_Applied, FirstName, LastName, Position1, Position2, Position3

我想返回申请同一员工的额外行的多个职位。因此,如果一个人申请3个不同的职位,那么该员工将返回3个不同的行。

APPNO, Date_Applied, FirstName, LastName, Position1,
APPNO, Date_Applied, FirstName, LastName, Position2
APPNO, Date_Applied, FirstName, LastName, Position3

4 个答案:

答案 0 :(得分:3)

规范化非常重要,但是这样的事情会起作用:

SELECT APPNO, Date_Applied, FirstName, LastName, Position1 AS position
UNION ALL
SELECT APPNO, Date_Applied, FirstName, LastName, Position2
WHERE Position2 IS NOT NULL
UNION ALL
SELECT APPNO, Date_Applied, FirstName, LastName, Position3
WHERE Position3 IS NOT NULL

答案 1 :(得分:3)

使用CROSS APPLY的另一种方式:

SELECT  t.APPNO,
        t.Date_Applied,
        t.FirstName,
        t.LastName,
        x.Position
FROM YourTable t
CROSS APPLY 
(
    VALUES
        (t.Position1),
        (t.Position2),
        (t.Position3)
) x (Position)
WHERE x.Position IS NOT NULL;

答案 2 :(得分:3)

由于您使用的是SQL Server,因此您也可以使用UNPIVOT函数:

select appono,
  date_applied,
  firstname,
  lastname,
  position
from yourtable
unpivot
(
  position
  for col in (Position1, Position2, Position3)
) unpiv

答案 3 :(得分:0)

这是一回事吗?

选择 APPNO,DATE_APPLIED,First_Name,Last_Name,SEX,RACE,POSITIONS_APPLIED_FOR_1 [位置]
来自 PYAppRole.APPLICNT
联盟
选择 APPNO,DATE_APPLIED,First_Name,Last_Name,SEX,RACE,POSITIONS_APPLIED_FOR_2 [位置]
来自 PYAppRole.APPLICNT
联盟
选择 APPNO,DATE_APPLIED,First_Name,Last_Name,SEX,RACE,POSITIONS_APPLIED_FOR_3 [位置]
来自 PYAppRole.APPLICNT
联盟
选择 APPNO,DATE_APPLIED,First_Name,Last_Name,SEX,RACE,POSITIONS_APPLIED_FOR_4 [位置]
来自 PYAppRole.APPLICNT