同时发言SQL标带来空值

0

的问题

我有一个表与典型价值,如:识别、电话号码、人名等等。 在这个表格如果一个人有多个电话号码,人将会出现多次,每一次迭代有不同的电话号码对应的那个人。

我的目标是编写一个标,将增加所有不同的电话一个人有一个单一的电话价值的新表,他们每个人分隔','. 在这样每个人将只出现一次的表格,但是电话号码,价值将有al的电话号码的那人拥有分开由','.

我是来与这样的事情:

我在这里创建"标准化"的表格的人士的信息应插入:

CREATE TABLE IF NOT EXISTS Telefono_General_V2 (Cedula_v2 varchar(50),Nombre_v2 varchar(50),Cantidad int, Telefono_v2 varchar(max))

这是一个临时的表来选择人的身份证多次重复,这意味着它有多个电话号码(Telefonos_General是表我得到的数据)。

SELECT  Cedula_v1 AS Cedula, COUNT(1) AS cantidad_repetidos
INTO #DatosRepetidosTemp
FROM Telefonos_General
GROUP BY Cedula_v1
HAVING  COUNT(1) >1

在这里我宣布中使用的变量的光标:

DECLARE
@Cedula varchar(50),
@Cuenta int,
@Prev_Telefono varchar(max),
@Telefonos varchar(max)

然后宣布标本身:

DECLARE cursor_telefonos CURSOR FOR 
SELECT TOP (100) Cedula, cantidad_repetidos, Telefono_v1
FROM #DatosRepetidosTemp     
JOIN Telefonos_General on Cedula_v1 = Cedula
WHERE  Cedula is not null

启动光标:

OPEN cursor_telefonos  
FETCH NEXT FROM cursor_telefonos 
INTO @Cedula, @Cuenta, @Prev_Telefono
WHILE @@FETCH_STATUS = 0   
BEGIN  
    IF @Telefonos = NULL
        SET @Telefonos = @Prev_Telefono
    ELSE

这是同时循环,返回@Prev_Telefono作为空时它应该(@Telefonos+','+@Prev_Telefono).

    WHILE @Cuenta != 0
    BEGIN
        SET @Telefonos = @Telefonos+ ', ' + @Prev_Telefono
        SET @Prev_Telefono = @Telefonos
        SET @Cuenta = @Cuenta - 1

    END
    INSERT IGNORE INTO Telefono_General_V2 (Cedula_v2, Cantidad, Telefono_v2)
    VALUES (@Cedula, @Cuenta, @Telefonos)

    FETCH NEXT FROM cursor_telefonos INTO @Cedula, @Cuenta, @Telefonos

在这里,我只是闭上的光标:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

有人知道为什么我的同时循环插入空的新手机表时,应该添加一个清单的电话号码的那人?

谢谢你的注意力!!

database database-cursor sql
2021-11-24 02:51:22
1

最好的答案

0

如果我理解正确的,那么下面的可能原因。

1- 在码你在哪里找到的人的id具有多个电话号码,然后获得的不同电话号码,特别是人身份证之后参加与Telefonos_General. (在这里你应该很短的数据的人的id虽然加入会照顾好它但请不要对其进行验证)

2- 在变声明的代码分配的价值观,以Telefonos(请验证的其他发言).

注意--也为你使用的情况下可以使用的字符串总的功能,这将增加所有的电话号码,用逗号分隔。 (我以前用这个功能对于相同的使用情况Postgress但我肯定你会得到它在mssql。)

假设你有数据,如下面

name    date1
 A    2019-03-01
 B    2020-03-01
 A    2021-03-01
 B    2022-03-01
 C    2023-03-01

你可以用下面的查询

select name,string_agg(date1,',') as merge_date from table_name group by name

这会给你:

name    merge_date
 A    2019-03-01,2021-03-01
 B    2022-03-01,2020-03-01
 C    2023-03-01
2021-11-24 04:51:29

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................