У меня есть таблица с типичными значениями, такими как: идентификационный номер, номер телефона, имя человека и т.д. В этой таблице, если у человека более одного телефонного номера, этот человек будет отображаться несколько раз, на каждой итерации с другим номером телефона, соответствующим этому человеку.
Моя цель состоит в том, чтобы написать курсор, который добавит все разные телефоны, которые есть у человека, в одно значение телефона в новой таблице, каждый из которых разделен знаком",". Таким образом, каждый человек будет отображаться в таблице только один раз, но в значении номера телефона будет указан номер телефона, которым владеет этот человек, разделенный знаком",".
Я пришел с чем-то вроде этого:
Здесь я создаю "нормализованную" таблицу, в которую следует вставить информацию о персонах:
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
Это цикл while, который возвращает @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
Кто-нибудь знает, почему мой цикл while вставляет нуль в таблицу новых телефонов, когда он должен добавлять список телефонных номеров этого человека?
Большое спасибо за ваше внимание!!