Kimlik, telefon numarası, kişi adı vb.Gibi tipik değerlere sahip bir tablom var. Bu tabloda, bir kişinin birden fazla telefon numarası varsa, o kişi birden çok kez görünecektir, her yineleme o kişiye karşılık gelen farklı bir telefon numarasına sahip olacaktır.
Amacım, bir kişinin sahip olduğu tüm farklı telefonları, her biri bir', 'ile ayrılmış yeni bir tabloda tek bir telefon değerine ekleyecek bir imleç yazmaktır. Bu şekilde, her kişi tabloda yalnızca bir kez görünür, ancak telefon numaraları değeri, o kişinin sahip olduğu telefon numarasını', 'ile ayırır.
Böyle bir şeyle geldim.:
Burada, kişi bilgilerinin eklenmesi gereken "normalleştirilmiş" tabloyu oluşturuyorum:
CREATE TABLE IF NOT EXISTS Telefono_General_V2 (Cedula_v2 varchar(50),Nombre_v2 varchar(50),Cantidad int, Telefono_v2 varchar(max))
Bu, birden çok kez tekrarlanan kişi kimliğini seçmek için geçici bir tablodur, yani birden fazla telefon numarası vardır (Telefonos_General, verileri aldığım tablodur).
SELECT Cedula_v1 AS Cedula, COUNT(1) AS cantidad_repetidos
INTO #DatosRepetidosTemp
FROM Telefonos_General
GROUP BY Cedula_v1
HAVING COUNT(1) >1
Burada imleçte kullanılan değişkenleri bildiriyorum:
DECLARE
@Cedula varchar(50),
@Cuenta int,
@Prev_Telefono varchar(max),
@Telefonos varchar(max)
Ardından imlecin kendisini bildirin:
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
İmleci başlat:
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
(@Telefonos+', ' + @Prev_Telefono) olması gerektiğinde @Prev_Telefono null olarak döndüren while döngüsü budur.
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
Burada sadece imleci kapatıyorum:
END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos
Birisi while döngüsünün neden o kişinin telefon numaralarının bir listesini eklemesi gerektiğinde yeni telefonlar tablosuna null eklediğini biliyor mu?
İlginiz için çok teşekkürler!!