这是我想要做的示例代码,下面是结果:
CREATE TABLE dbo.#TempDoc_DocContRoles (DocID int null, FullName varchar(500), DocContRole varchar (100), NumRole int null) INSERT INTO #TempDoc_DocContRoles(DocID, FullName, DocContRole) SELECT d.DocID, c.FirstName + ' ' + c.LastName as FullName, ldcro.DocContRole FROM Document as d JOIN dbo.Split( ',','30,31') AS l ON d.DocID = cast(l.[Value] AS int) JOIN Doc_Contact AS dc ON d.DocID = dc.DocID JOIN Contact AS c ON dc.P_Number = c.P_Number LEFT JOIN lkpDocContactRole AS ldcro ON ldcro.DocContRoleID = dc.DocContRoleID JOIN dbo.Split( ',','1,2,7') AS r ON ldcro.DocContRoleID = cast(r.[Value] AS int) CREATE TABLE dbo.#MaxNumRoles (DocID int null, DocContRole varchar(100), NumRole int null) INSERT INTO dbo.#MaxNumRoles (DocID,DocContRole,NumRole) SELECT DocID, DocContRole, COUNT(*) FROM dbo.#TempDoc_DocContRoles GROUP BY DocID, DocContRole HAVING Count(*) > 0 UPDATE td SET td.NumRole = mr.NumRole FROM dbo.#TempDoc_DocContRoles as td INNER JOIN dbo.#MaxNumRoles as mr ON td.DocContRole = mr.docContRole SELECT * FROM dbo.#TempDoc_DocContRoles DROP TABLE dbo.#TempDoc_DocContRoles DROP TABLE dbo.#MaxNumRoles
结果:
DocID FullName DocContRole NumRole 30 Smith Author 3 30 Daln Staff 2 30 Dolby Author 3 31 Tammy Author 3 30 Barny Author 3 30 Sanny Res Coor 1 30 Johny Staff Rev 2
我想实际得到:
DocID FullName DocContRole NumRole 30 Smith Author 1 30 Daln Staff 1 30 Dolby Author 2 31 Tammy Author 1 30 Barny Author 3 30 Sanny Res Coor 1 30 Johny Staff Rev 2
它应该NumRole按docContRole和增加数字docID(例如作者1,作者2等)。目前,它给出了每位作者的总数DocID。
NumRole
docContRole
docID
DocID
我的最终目标是获得类似
DocID Author_1 Author_2 Author_3 Staff_1 Staff_2 ResCoor_1 30 Smith Dolby Barny Daln Johny Sanny 31 Tammy
你可以试试这个
select td.DocID, td.FullName, td.DocContRole, row_number() over (partition by td.DocID, td.DocContRole order by td.FullName) as NumRole from dbo.#TempDoc_DocContRoles as td
所以动态SQL会像这样
SQL范例
create table #t2 ( DocID int, FullName nvarchar(max), NumRole nvarchar(max) ) declare @pivot_columns nvarchar(max), @stmt nvarchar(max) insert into #t2 select td.DocID, td.FullName, td.DocContRole + cast( row_number() over (partition by td.DocID, td.DocContRole order by td.FullName) as nvarchar(max)) as NumRole from t as td select @pivot_columns = isnull(@pivot_columns + ', ', '') + '[' + NumRole + ']' from (select distinct NumRole from #t2) as T select @stmt = ' select * from #t2 as t pivot ( min(FullName) for NumRole in (' + @pivot_columns + ') ) as PT' exec sp_executesql @stmt = @stmt