2013-05-30 46 views
1

有人可以帮助我解决这个问题。SQl查询从单行获取数据作为多行

我有一个表结构如下

Department_name | Owner_ID | Approver_ID 
----------------------------------------- 
Dept 1   | 1234567 | 1234567 

现在我想根据员工ID输出如下

select department_name,Role where Owner_ID= '1234567' or Approver_ID = '1234567' 

Department_name | Role 
------------------------- 
Dept 1   | Owner 
Dept 1   | Approver 

更重要的是,我需要得到它作为如上所示的两个单独的行并且角色不是表中的列,其值将是基于给定ID的批准者或所有者。

我无法弄清楚如何得到这个。 在此先感谢。

+0

在该表的列“角色”可用? –

+0

我没有角色专栏。我需要根据所有者ID和Approver ID来获取它。如果Id given = Owner_Id角色是所有者,并且如果id = Approver_ID角色是App​​rover,并且如果Owner_ID = Approver_ID =给定ID,则需要将它们分成两个独立行,如上所示。 –

回答

1

一个简单的解决方案将是一个联合:http://sqlfiddle.com/#!6/f13c9/5/0

SELECT 
    Department_name, 
    'Owner' 
FROM test 
WHERE Owner_ID = 1234567 

UNION ALL 

SELECT 
    Department_name, 
    'Approver' 
FROM test 
WHERE Approver_ID = 1234567 
+0

你能告诉我如何在此查询中应用顺序..? –

+0

@Sravan:在这种情况下,您需要将此用作子查询:http://sqlfiddle.com/#!6/fdf8f/1/0 – Wolph

+0

您可以仅在最后一个查询结束时应用ORDER BY,在这种情况下就在WHERE Approver_ID = 1234567'行之后。 –

0

您也可以使用应用运算

SELECT t.Department_name, o.Role  
FROM dbo.YourTable t 
    CROSS APPLY (
       VALUES(CASE WHEN t.Owner_ID = '1234567' THEN 'Owner' END), 
        (CASE WHEN t.Approver_ID = '1234567' THEN 'Approver' END) 
       ) o(Role) 
WHERE o.Role IS NOT NULL 
0

尝试这个

选择部门名称,角色 FROM表名 UNPIVOT( (Owner_ID,Approver_ID)中的Department_name角色)角色

+0

我如何才能获得作为所有者和审批者的角色 –

1

请试试这个..

SELECT Department_name, 
CASE WHEN Role = (SELECT Owner_ID FROM Department) 
THEN 'Owner' ELSE 'Approver' 
END AS Role 
FROM Department 
UNPIVOT(Role for Column1 in(Owner_ID,Approver_ID)) AS Role 
+0

对于此解决方案,您的owner_id和approver_id必须与连续不同 –

+0

两者将位于同一行 –

+0

您owner_id和对于我的解决方案,approver_id必须不同。 只需更改approver_id并运行脚本。 –