【问题标题】:Concate string into temp table in cursor将字符串连接到光标中的临时表中
【发布时间】:2020-06-22 03:52:04
【问题描述】:

我有一个像这样的临时表结构@temp2

route   total    driverID
------------------------
10B      300    
7B       400

并希望添加driverID 列,其结果类似于5555, 68989

为此,我使用光标循环另一个表,如下所示

driverID    routeNo
-------------------
5555        10B
68989       10B
72000       7B

这里是代码

declare @driverID varchar(max)
declare @routeNew varchar(20)



DECLARE brand_cursor CURSOR FOR     

        select distinct driver_id, route_number from [dbcwl].[dbo].[collection_deduction_summary] 
        where YEAR(trans_date) =  @year
        and MONTH(trans_date) = @month
        and route_number in (select actual_route from [dbcwl].[dbo].[livedispatchingdata_pmhs_daily_summary] where status = 'OK' and YEAR(trans_date) = @year AND month(trans_date) = @month )
        and vehicle_id in (select vehicle_id from [dbcwl].[dbo].[livedispatchingdata_pmhs_daily_summary] where status = 'OK' and YEAR(trans_date) = @year AND month(trans_date) = @month  )
        group by route_number, driver_id
        OPEN brand_cursor    

FETCH NEXT FROM brand_cursor     
INTO @driverID, @routeNew

WHILE @@FETCH_STATUS = 0    
BEGIN    
        --update @temp2
        update @temp2 set driverID +=  ','+ @driverID where routeNo = @routeNew; 

        FETCH NEXT FROM brand_cursor     
    INTO @driverID, @routeNew

    END     
    CLOSE brand_cursor;    
    DEALLOCATE brand_cursor;

遗憾的是,我得到 driverID 列为空

并且希望最终的临时表看起来像这样:

 route   total    driverID
    ------------------------
    10B      300    5555,68989
    7B       400    72000

【问题讨论】:

    标签: sql sql-server cursor concat temp-tables


    【解决方案1】:
    ;with cte as -- Step 1: Get all Driver Ids by routeNo
    (
      SELECT routeNo, driverID = 
        STUFF((SELECT DISTINCT ', ' + CAST(driverID AS NVARCHAR(100))
               FROM #A b 
               WHERE b.routeNo = a.routeNo 
              FOR XML PATH('')), 1, 2, '')
    FROM #A a
    GROUP BY routeNo
    )
    update b -- Step 2: Update driverID accordingly.
    set driverID = cte.driverID
    from #B b
    inner join cte on b.route = cte.routeNo
    

    Result here

    【讨论】:

    • 你介意我是否也可以获得每条路线的总司机ID吗? @phong
    • 是这个吗? dbfiddle.uk/…
    【解决方案2】:

    你可以string_agg():

    update t
        set t.driverID = ot.drivers
        from @temp2 t join
             (select ot.routeNo, string_agg(driverID, ',') as drivers
              from othertable ot
              group by ot.routeNo
             ) ot
             on t.routeNo = ot.routeNo;
    

    【讨论】:

      猜你喜欢
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多