我发现了类似的问题,但没有任何解决方案我已经能够为我工作。我已经没有实践并坚持下去。
我有一张跟踪员工职位的表。每位员工可以拥有任意数量的活跃职位。我希望将每个员工显示为单个记录,并将该记录中的所有职位划分为多个列。
一瞥数据显示,没有超过6个活跃职位的员工,因为这是一次性查询,我应该可以使用该号码。
所有职位都分配了一个序列号,但它们并不是一个非常方便的顺序 - 员工的非活动职位保留了序列号。
所以现在我有一些看起来像这样的东西:
ID | Name | Title | Cat | Seq
------------------------------
10 | John | Asst. | HR | 13
10 | John | Tutor | EDU | 17
11 | Sue | Mgr | PA | 6
11 | Sue | Adj. | EDU | 7
11 | Sue | Tutor | EDU | 13
...
11 | Sue | Asst. | HR | 22
但我希望它看起来像这样:
ID | Name | Title 1 | Cat 1 | Title 2 | Cat 2 | Title 3...| Title 6 | Cat 6
----------------------------------------------------------------------------
10 | John | Asst. | HR | Tutor | EDU | NULL | NULL | NULL
11 | Sue | Mgr. | PA | Adj. | EDU | Tutor | Asst. | HR
让我知道我需要提供哪些其他信息。
答案 0 :(得分:0)
您可以使用row_number和pivot的组合来执行此操作。使用SQL Server 2012+,查询可能如下所示。它有点乱,但应该完成工作,尽管可能有更好的方法来实现相同的结果。
select
id
, name
, max([Title 1]) as [Title 1]
, max([Cat 1]) as [Cat 1]
, max([Title 2]) as [Title 2]
, max([Cat 2]) as [Cat 2]
, max([Title 3]) as [Title 3]
, max([Cat 3]) as [Cat 3]
-- and so on for the remaining columns...
from (
select
id, name, title, cat
, t = concat('Title ',row_number() over (partition by id order by seq))
, c = concat('Cat ',row_number() over (partition by id order by seq))
from your_table
) src
pivot ( max(title) for t in ([title 1],[title 2],[title 3]) )pt
pivot ( max(cat) for c in ([cat 1],[cat 2],[cat 3]) )pc
group by id, name;
我只写出了标题/猫1到3以节省一些空间,但你应该明白这一点。
示例结果:
| id | name | Title 1 | Cat 1 | Title 2 | Cat 2 | Title 3 | Cat 3 |
|----|------|---------|-------|---------|-------|---------|--------|
| 10 | John | Asst. | HR | Tutor | EDU | (null) | (null) |
| 11 | Sue | Mgr | PA | Adj. | EDU | Tutor | EDU |