2013-04-26 23 views
3

我有一张表格显示每个员工,并列出他们作为单独列应用的职位。将多个列值作为新行返回SQL

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

回答

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 
+0

+1为简单起见 – Lamak 2013-04-26 20:14:33

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; 
+1

+1更复杂的替代 – Kermit 2013-04-26 20:15:16

+2

@FreshPrinceOfSO但它是如此优雅得多,这就是所有重要的 – Lamak 2013-04-26 20:23:42

3

由于您使用的SQL Server,你也可以使用UNPIVOT功能:

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

+1另一种选择(和回来) – Lamak 2013-04-26 20:35:40

+0

哇感谢您的快速回复! – 2013-04-26 21:14:26

0

这是一样的东西吗?

选择 APPNO,DATE_APPLIED,名字,姓氏,性别,种族,POSITIONS_APPLIED_FOR_1 [位置]
PYAppRole.APPLICNT
工会
选择 APPNO,DATE_APPLIED,名字,姓氏,性别, RACE,POSITIONS_APPLIED_FOR_2 [位置]
PYAppRole.APPLICNT
工会
选择 APPNO,DATE_APPLIED,名字,姓氏,性别,种族,POSITIONS_APPLIED_FOR_3 [位置]
PYAppRole.APPLICNT
工会
选择 APPNO,DATE_APPLIED,名字,姓氏,性别,种族,POSITIONS_APPLIED_FOR_4 [位置]
PYAppRole.APPLICNT