2010-10-05 85 views
2

這一個看起來很簡單,但我無法弄清楚。使用SQL壓扁數據

我有存儲這樣的數據...

ManagerID  EmployeeID  MangerName 
0    0    Debbie 
1    0    Mark 
2    2    Chris 
3    2    Leo 
4    1    Mar 
5    2    Steve 
6    2    Mar 

我想這個輸出看起來像

EmployeeID Manager1 Manager2 Manager3  Manager4 
0    Debbie  Mark  Null   Null 
1    Mar   Null  Null   Null 
2    Chris  Leo   Steve  Mar 

我知道只能有四個條目如此四名經理。我知道我需要使用自聯接...但我不斷收到回斷絕看起來像

0 Debbie Mark Mark Debbie 
0 Debbie Debbie Mark Debbie etc. 

請幫助

+1

您的查詢是什麼樣的? – Lazarus 2010-10-05 13:41:26

+0

這是一個奇怪的樹形結構數據庫表...而不是與管理人員,僱員(管理人員也是員工)和他們之間的關係表。但這與你的問題無關。 – 2010-10-05 13:49:08

+0

哪個sql方言? – Beth 2010-10-05 15:31:35

回答

0

SQL Server 2005Oracle 9PostgreSQL 8.4(或以上):

WITH q AS 
     (
     SELECT employeeId, managerId, ROW_NUMBER() OVER (PARTITION BY employeeID ORDER BY managerId) AS rn 
     FROM mytable 
     ) 
SELECT q1.employeeId, q1.managerName, q2.managerName, q3.managerName, q4.managerName 
FROM q q1 
JOIN q q2 
ON  q2.employeeId = q1.employeeId 
     AND q2.rn = 2 
JOIN q q3 
ON  q3.employeeId = q1.employeeId 
     AND q3.rn = 3 
JOIN q q4 
ON  q4.employeeId = q1.employeeId 
     AND q4.rn = 4 
WHERE q1.rn = 1 

MySQL

SELECT employeeId, 
     (
     SELECT managerName 
     FROM mytable mi 
     WHERE mi.employeeId = md.employeeId 
     ORDER BY 
       mi.employeeId, mi.managerId 
     LIMIT 0, 1 
     ) AS manager1, 
     (
     SELECT managerName 
     FROM mytable mi 
     WHERE mi.employeeId = md.employeeId 
     ORDER BY 
       mi.employeeId, mi.managerId 
     LIMIT 1, 1 
     ) AS manager2, 
     (
     SELECT managerName 
     FROM mytable mi 
     WHERE mi.employeeId = md.employeeId 
     ORDER BY 
       mi.employeeId, mi.managerId 
     LIMIT 2, 1 
     ) AS manager3, 
     (
     SELECT managerName 
     FROM mytable mi 
     WHERE mi.employeeId = md.employeeId 
     ORDER BY 
       mi.employeeId, mi.managerId 
     LIMIT 3, 1 
     ) AS manager4 
FROM (
     SELECT DISTINCT employeeId 
     FROM mytable 
     ) md 
0

首先,我拿EmployeeID's的清單列表,然後我加入該表以查找該Employee ID的MIN ManagerID。之後,它的左邊三個連接各尋找下一個MIN經理ID比以前更大(如果存在的話..)

select baseE.EmployeeID, 
     m1.ManagerName as Manager1, 
     ISNULL(m2.ManagerName,'') as Manager2, 
     ISNULL(m3.ManagerName,'') as Manager3, 
     ISNULL(m4.ManagerName,'') as Manager4 
from 
     (select distinct EmployeeID 
     from EmployeeManagers 
     order by EmployeeID) baseE 
join EmployeeManagers m1 
    on baseE.EmployeeID = m1.EmployeeID 
     and m1.ManagerID = (select MIN(ManagerID) 
          from EmployeeManagers 
          where EmployeeID = baseE.EmployeeID) 
left join EmployeeManagers m2 
      on baseE.EmployeeID = m2.EmployeeID 
      and m2.ManagerID = (select MIN(ManagerID) 
           from EmployeeManagers 
           where EmployeeID = baseE.EmployeeID 
           and ManagerID > m1.ManagerID) 
left join EmployeeManagers m3 
      on baseE.EmployeeID = m3.EmployeeID 
      and m3.ManagerID = (select MIN(ManagerID) 
           from EmployeeManagers 
           where EmployeeID = baseE.EmployeeID 
           and m2.ManagerID IS NOT NULL 
           and ManagerID > m2.ManagerID) 
left join EmployeeManagers m4 
      on baseE.EmployeeID = m4.EmployeeID 
      and m4.ManagerID = (select MIN(ManagerID) 
           from EmployeeManagers 
           where EmployeeID = baseE.EmployeeID 
           and m3.ManagerID IS NOT NULL 
           and ManagerID > m3.ManagerID) 
0

您可以使用PIVOT和ROW_NUMBER(SQL Server 2005和以上)。

SELECT EmployeeID, [1] Manager1, [2] Manager2, [3] Manager3, [4] Manager4 
FROM 
(
    SELECT EmployeeID, ManagerName, 
     ROW_NUMBER() OVER (PARTITION BY EmployeeID 
         ORDER BY ManagerID) ManagerSequence 
    FROM Managers 
) a 
PIVOT (MIN(a.ManagerName) FOR a.ManagerSequence in ([1], [2], [3], [4])) b