SQL游标SUM VARCHAR重复

时间:2018-08-05 15:23:51

标签: sql-server sum cursor varchar

 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;

我有该数据:

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

我想以这种方式呈现:

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

有人可以帮助我吗? :)

我尝试使用游标:

但是我不知道如何将变量归因于重复数据。

所以我的输出数据如下:。

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

我使用SQL Server 2014

1 个答案:

答案 0 :(得分:1)

代码表明这是针对SQL Server的?如果是正确的并且我正确理解了您想要实现的目标,则根本不需要游标。

可以通过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;

或者,如果您已经在使用SQL Server 2017或更高版本,甚至更简单:

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

SQL Fiddle