Mentre l'istruzione SQL Cursore portando i valori null

0

Domanda

Ho una tabella con i valori tipici come: identificazione, numero di telefono, nome delle persone etc. In questa tabella se una persona ha più di un numero di telefono che la persona sarà visualizzato più volte, ogni iterazione con un diverso numero di telefono corrispondente a quella persona.

Il mio obiettivo è quello di scrivere un cursore che si andranno ad aggiungere tutti i telefoni diversi che una persona ha in un telefono unico valore in una nuova tabella, ognuno di loro separati da ', '. In questo modo ogni persona potrà apparire solo una volta in tavola, ma i numeri di telefono avrà il valore al numero di telefono che una persona possiede separati da ','.

Devo venire con qualcosa di simile a questo:

Qui ho creato il "normalizzato" tabella persone informazioni devono essere inserite:

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

Questa è una tabella temporanea per selezionare persone ID che viene ripetuta più volte, il che significa che ha più numeri di telefono (Telefonos_General è la tabella che sto ottenendo i dati).

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

Qui dichiaro le variabili utilizzate nel cursore:

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

Quindi dichiarare il cursore stesso:

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

Avviare il cursore:

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

Questo è il ciclo while che sta tornando @Prev_Telefono come null quando invece dovrebbe essere (@Themer+ ', ' + @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

Qui mi basta chiudere il cursore:

END
CLOSE cursor_telefonos
DEALLOCATE cursor_telefonos

Qualcuno sa perché il mio ciclo while è l'inserimento di null sui nuovi telefoni tabella quando dovrebbe essere l'aggiunta di un elenco di numeri di telefono di quella persona?

Grazie molto per la vostra attenzione!!

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

Migliore risposta

0

Se ho capito è corretta, sotto può essere il motivo .

1- nel codice In cui si sono trovare la persona di id avendo più il numero di telefono e quindi ottenere diversi numeri di telefono di una persona particolare, id, dopo l'unione con Telefonos_General. (Qui si dovrebbe a breve i dati della persona id sebbene join si prenderà cura di esso, ma si prega di non convalidare it)

2- la dichiarazione di variabile di codice in cui si assegnano i valori di Themer (si prega di convalidare l'istruzione else).

Nota-Anche per il tuo caso d'uso, è possibile utilizzare la Stringa di funzioni di Aggregazione che aggiungere tutti i numeri con la virgola come separatore. (Ho avuto in precedenza, utilizzare questa funzione per lo stesso caso di utilizzo in Postgress, ma sono sicuro che si otterrà in mssql come bene.)

Si supponga di disporre di dati come di seguito

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

È possibile utilizzare sotto query

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

Questo vi darà:

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

In altre lingue

Questa pagina è in altre lingue

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