SQL SELECT语句中的增量值 [英] Increment value in SQL SELECT statement

查看:236
本文介绍了SQL SELECT语句中的增量值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我要尝试执行的示例代码,下面是结果:

Here is the sample code for what I am trying to do and below is the result:

   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

对于每个docContRoledocID,它应该增加NumRole中的数字(例如作者1,作者2等).目前,它给出了每个DocID的作者总数.

It should increment the number in NumRole per docContRole and docID (ex Author 1, Author 2 etc). Currently it gives the total number of authors per DocID.

我的最终目标是得到类似的东西

My ultimate goal is to get something like

       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会像这样

So dynamic SQL will be smth like that

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

这篇关于SQL SELECT语句中的增量值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆