Search code examples
sql-serversumcursorvarchar

SQL cursor SUM VARCHAR duplicate


 DECLARE @sscc as INT;
 DECLARE @orders as varchar(255);
 DECLARE @value as varchar(255);
 DECLARE @cOrders as CURSOR;
 SET @value = 'Orders : '

 SET @cOrders = CURSOR FOR
 SELECT SSCC,ORDERS FROM dbo.TIM_StockGeo tsg WITH(NOLOCK)

 OPEN @cOrders

 FETCH NEXT FROM @cOrders INTO @sscc,@orders

 WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @value = @value + ' ' + @orders;
        PRINT CAST(@SSCC AS VARCHAR(64)) +  ' ' + @value;
        FETCH NEXT FROM @cOrders INTO @sscc,@orders;
    END

CLOSE @cOrders;
DEALLOCATE @cOrders;

I have that data :

10005555    /18/56789/01/1
10005555    /18/56654/01/1
10005555    /18/52090/01/1
10001111    /18/11111/01/1
10001111    /18/12121/01/1
10002222    /18/89283/01/1

I want present this at that way :

10005555    /18/56789/01/1, /18/56654/01/1, /18/52090/01/1
10001111    /18/11111/01/1, /18/12121/01/1
10002222    /18/89283/01/1

Could anyone help me ? :)

I tried with cursor :

But i don't know how ascribe to variable only duplicate data.

so my output data looks like this.. :

10005555 Orders :  /18/56789/01/1
10005555 Orders :  /18/56789/01/1 /18/56654/01/1
10005555 Orders :  /18/56789/01/1 /18/56654/01/1 /18/52090/01/1
10001111 Orders :  /18/56789/01/1 /18/56654/01/1 /18/52090/01/1 /18/11111/01/1
10001111 Orders :  /18/56789/01/1 /18/56654/01/1 /18/52090/01/1 /18/11111/01/1 /18/12121/01/1
10002222 Orders :  /18/56789/01/1 /18/56654/01/1 /18/52090/01/1 /18/11111/01/1 /18/12121/01/1 /18/89283/01/1

I use SQL server 2014


Solution

  • The code suggests this is for SQL Server? If that's right and I correctly understand, what you want to achieve, there's no need for a cursor at all.

    It can be done with a SELECT:

    SELECT tsg1.sscc,
           STUFF((SELECT ', ' + tsg2.orders
                         FROM dbo.tim_stockgeo tsg2
                         WHERE tsg2.sscc = tsg1.sscc
                         FOR XML PATH('')), 1, 2, '') orders
           FROM dbo.tim_stockgeo tsg1
           GROUP BY tsg1.sscc;
    

    Or, if you're already using SQL Server version 2017 or above, even simpler:

    SELECT tsg1.sscc,
           string_agg(tsg1.orders, ', ') orders
           FROM dbo.tim_stockgeo tsg1
           GROUP BY tsg1.sscc;
    

    SQL Fiddle