Конкретировать строку во временную таблицу в курсоре - PullRequest
0 голосов
/ 10 марта 2020

У меня есть временная структура таблицы @temp2, как это

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

, и я хотел бы добавить столбец driverID с результатом, подобным 5555, 68989

, чтобы сделать это, Я использую курсор для l oop другая таблица выглядит следующим образом

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

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Вы можете 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;
1 голос
/ 10 марта 2020
;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

Результат здесь

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...