0

数据库问题(我们使用的是 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]

第一个问题这只给了我第二大的问题,如果没有更大的元素,即如果员工只有一个项目,它仍然会为员工 ID 1 返回 1,为员工 ID 2 返回 1。我已经尝试过案例陈述他们刚刚对我大发雷霆。有没有更简单的方法来做到这一点?

我不能简单地归还所有员工,我必须把每个员工放到自己的领域。如果将单个字段的多个员工返回到项目中,则前端无法读取它。我不是在写我们要引进一家新公司的前端,他们不能改变他们的代码。

我需要的是每个员工在他自己的领域,对于最初的混淆,我很抱歉,我们在这个数据库中有数百名员工,并不是每个项目都参与其中。所以我们需要第一个槽中最低的员工 id,第二个槽中的第二低到 14。它进入一个看起来像这样的有趣表。我无法控制它是如何形成的,我只需要将我们的初始数据放入这个表格中。

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 插入到属性的字段中。老实说,如果您知道一种进入底线的方法,那就更好了。我只是想节省你们的时间。

4

2 回答 2

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

此查询的结果是:

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

这样做,将以标准化的方式离开您的桌子。如果您有 100 个项目,您将不希望将 100 个不同的列添加到您的表中。您可以使用 SQL(如上)或在您的应用程序代码中轻松操作数据以将其转换为您需要的格式。

编辑,根据您的更改,您应该仍然可以PIVOT在现有表结构上使用 a :

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

结果:

| PROJECTID | EMPLOYEEID1 | EMPLOYEEID2 |
-----------------------------------------
|         1 |           1 |           2 |
|         2 |           1 |           2 |
|         3 |           1 |      (null) |
于 2012-11-27T20:05:54.650 回答
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 级别使事情复杂化。

于 2012-11-27T20:12:57.133 回答