जबकि बयान में SQL कर्सर लाने नल मान

0

सवाल

मैं एक तालिका के साथ एक ठेठ मूल्यों की तरह: पहचान, फोन नंबर, व्यक्ति का नाम आदि. इस तालिका में यदि एक व्यक्ति को एक से अधिक फोन नंबर उस व्यक्ति को कई बार प्रकट, प्रत्येक यात्रा के साथ एक अलग फोन नंबर के लिए इसी है कि व्यक्ति.

मेरा लक्ष्य है लिखने के लिए एक कर्सर जोड़ना होगा कि सभी अलग-अलग फोन में एक व्यक्ति एक ही फोन के मूल्य में एक नई तालिका, उनमें से प्रत्येक के द्वारा अलग ', '. में है कि जिस तरह प्रत्येक व्यक्ति को केवल एक बार दिखाई तालिका में है, लेकिन फोन नंबर मूल्य होगा अल फोन नंबर है कि व्यक्ति के मालिक द्वारा अलग ','.

मैं के साथ आते हैं, कुछ इस तरह:

मैं यहाँ बनाने के लिए "सामान्यीकृत" टेबल है कि व्यक्तियों की जानकारी होना चाहिए सम्मिलित करें:

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- कोड में जहाँ आप कर रहे हैं व्यक्ति को खोजने के आईडी होने के कई फोन नंबर और अलग-अलग फोन नंबर के लिए है कि विशेष रूप से व्यक्ति के आईडी में शामिल होने के बाद यह Telefonos_General. (यहाँ आप होना चाहिए कम अपने डेटा पर व्यक्ति आईडी हालांकि मिलती है इसे का ख्याल रखना होगा, लेकिन कृपया यह मान्य)

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ý
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में