2012-11-27 129 views
0

數據庫問題(我們正在使用T-SQL)將多個記錄轉換爲單個記錄T-SQL

我目前正在研究員工和項目之間的關係。

我們正試圖重構數據庫來工作。

舊數據庫中包含的信息是這樣

Employee ID Project ID 
1   1 
1   2 
1   3 
2   1 
2   2 

我們需要將其轉換成單記錄每個員工像這樣

Project ID Employee ID 1 Employee ID 2 
1   1    2 
2   1    2 
3   1    null 

這裏是我已經試過SQL代碼,但我有已經遇到了問題,現在每個員工有三個以上的人,這只是一個例子。相信我,如果只有三個或兩個,我只會使用最大或最小值並完成它。

Select [Project ID], min([Employee ID]) 
From dbo.[Employee Project ID] 
where [Employee ID] > select (Min([Employee ID]) form dbo.[Employee Project ID]) 
Group by [Project ID] 

第一個問題這只是給了我第二大,並 如果是IE沒有大的元素,如果只有一個項目的員工一直在它仍然會返回1僱員ID 1和1員工ID 2.我已經試過病例陳述,他們剛剛炸燬了我。有沒有更簡單的方法來做到這一點?

我不能簡單地將所有員工退回來,我必須讓每個員工都進入自己的領域。如果它將單個字段的多個員工返回到項目中,則前端無法讀取它。我不是在寫一個新公司的前端,他們也不能改變他們的代碼。

我需要的是每個員工都在自己的領域,對於最初的混淆,我很抱歉,我們有數百名員工在這個數據庫中,而不是每個項目上都有。所以我們需要第一個槽中最低的員工編號和第二個槽中第二個最低的員工編號。它會變成一張有趣的表格,看起來像這樣。我無法控制這種情況,我只需要將我們的初始數據轉化爲這種形式即可。

Project ID  Attribute  Information 
1    Employee ID 1 1 
1    Employee ID 2 2 
2    Employee ID 1 1 
2    Employee ID 2 2 
3    Employee ID 1 1 
3    Employee ID 2 null 

基本上我要去插入僱員ID 1到表和插入僱員ID 1到用於該屬性的字段。老實說,如果你知道一種方法來達到更好的底部表。我只是想節省你們的時間。

+9

不要。不要。這是存儲數據的不好方法。舊的方法是存儲這些信息的**正確**方式。 –

+0

我們正在將a遷移到新的前端,這不是數據存儲的方式。基本上會有一個新的記錄,每個都會以不同的方式存儲,但有點難以解釋,但我不知道如何爲屬性名稱分配這些標籤。 – osfp2328

+2

「前端」表示顯示和UI邏輯。 「後端」意味着存儲和業務規則邏輯。如果你正在轉向新的前端,那不應該改變你的存儲。您的新前端可能會以新方式**顯示**數據,但這與存儲方式不同,並且在您之間的某個位置需要可以轉發數據的代碼。存儲方非常需要保留在舊模式中。新的模式只是簡單_wrong_。 SQL數據庫表**必須**有一個固定數量的columns_,並且編號列幾乎總是一個非常嚴重的設計缺陷。 –

回答

1

我完全同意@ JoelCoehoorn的評論,留下你的表在當前結構。如果再需要在其他版本的應用程序和/或用戶來顯示它,那麼你可以使用一個PIVOT此類似:

select EmployeeId, 
    [1] ProjectId1, 
    [2] ProjectId2, 
    [3] ProjectId3 
from 
(
    select EmployeeID, projectid, 
    row_number() over(partition by employeeid order by projectid) rn 
    from yourtable 
) src 
pivot 
(
    max(projectid) 
    for rn in ([1], [2], [3]) 
) piv 

SQL Fiddle with Demo

結果從該查詢是:

| EMPLOYEEID | PROJECTID1 | PROJECTID2 | PROJECTID3 | 
----------------------------------------------------- 
|   1 |   1 |   2 |   3 | 
|   2 |   1 |   2 |  (null) | 

這樣做會使您的表格保持標準化。如果您有100個項目,則不會希望將100個不同的列添加到您的表中。您可以使用SQL(如上所述)或在您的應用程序代碼中輕鬆操作數據以將其轉換爲您需要的格式。

編輯,根據你的變化,你還是應該能夠在現有的表結構使用PIVOT

select projectid, 
    [1] EmployeeID1, 
    [2] EmployeeID2 
from 
(
    select EmployeeID, projectid, 
    dense_rank() over(partition by projectid order by employeeid) dr 
    from yourtable 
) src 
pivot 
(
    sum(dr) 
    for EmployeeId in ([1], [2]) 
) piv 

SQL Fiddle with Demo

結果:

| PROJECTID | EMPLOYEEID1 | EMPLOYEEID2 | 
----------------------------------------- 
|   1 |   1 |   2 | 
|   2 |   1 |   2 | 
|   3 |   1 |  (null) | 
+0

@ osfp2328看到我的編輯,「PIVOT」版本仍然可以與員工一起工作 – Taryn

0

你可以這樣做:

declare @t table (EmployeeID int, ProjectId int) 
insert @t 
select 1, 1 
union select 1, 2 
union select 1, 3 
union select 2, 1 
union select 2, 2 

select distinct EmployeeID 
, 
(
    select ProjectId 
    from @t b 
    where a.EmployeeId = b.EmployeeId 
    for xml path(''), root('Projects') 
) ProjectsXML 
from @t a 

輸出

EmployeeID ProjectsXML 
1   <Projects><ProjectId>1</ProjectId><ProjectId>2</ProjectId><ProjectId>3</ProjectId></Projects> 
2   <Projects><ProjectId>1</ProjectId><ProjectId>2</ProjectId></Projects> 

然而,最好讓你的UI代碼打理這不是事情在SQL級別複雜化。