>Nel mio database ci sono molti valori Null. Ho provato ad inserire
>valori Null nel database di esempio (sia nel campo StudenteID
>che in Nome) e mi viene restituito il medesimo errore che ottengo
>con il vero database: "Tipi di dati non corrispondenti".
>
>Come fare con questi valori? Dunque, i record con ID nullo (tipo
>StudenteID = Null) possono anche essere esclusi dal raggruppamento
>mentre i valori Null di Nome vanno concatenati (ad esempio "Valeria
>& Null" dovrebbe restituire "Valeria")
Beh toni,
tu stai utilizzando un DBMS come se fosse un foglio Excel
Tabelle con valori NULL, tabelle senza chiavi primarie... insomma, una cosa brutta
>Nota: la sintassi corretta nella query è Concatena( ... ; ...
>; ... ) e non Concatena ( ... , ... , ... )
Devi semplicemente apportare una piccola modifica sia alla funzione che alla alla query.
Supponiamo di avere la tabella Studenti popolata con le seguenti righe:
StudenteID Nome
----------- --------
NULL Chiara
A Claudio
B NULL
B Sara
B Andrea
NULL Giordano
B NULL
B NULL
B Alfonso
C Luca
C NULL
C NULL
NULL Gianluca
C Roberto
La funzione Contatena dovrà prevedere il caso in cui Nome sia NULL:
Public Function Concatena(ByVal StudenteID As String,
ByVal Nome As String,
ByVal Separatore As String) As String
Static s_strStudenteID As String
Static s_strOutput As String
' Verifico se si tratta di un nuovo studente
If s_strStudenteID <> StudenteID Then
' Memorizzo lo studente
s_strStudenteID = StudenteID
' Inizializzo la variabile di output con il nome dello studente
s_strOutput = Nome
Else
' Se al precedente ciclo non avevo valorizzato
' la stringa di output, non metto il separatore
If Len(s_strOutput) = 0 Then
s_strOutput = s_strOutput & Nome
' Se il Nome è valorizzato, allora effettuo la concatenazione
' Altrimenti ciccia
ElseIf Len(Nome) > 0 Then
s_strOutput = s_strOutput & Separatore & Nome
End If
End If
' Valorizzo il valore di ritorno della funzione
Concatena = s_strOutput
End Function
E la query diventa:
SELECT StudenteID, MAX(Concatena(StudenteID, IIF(Nome IS NULL, '', Nome),'; ')) AS Nomi
FROM Studenti
WHERE StudenteID IS NOT NULL
GROUP BY StudenteID;
Eseguendola otterrai il seguente risultato:
StudenteID Nomi
----------- --------
A Claudio
B Sara; Andrea; Alfonso
C Luca; Roberto
esattamente come richiesto.
>Altra domanda: In che modo posso usare come separatore il carattere
>di invio (testo a capo)? Ho provato con Chr$(13) ma non funziona.
>Ho provato ad battere nel testo separatore [Ctrl+invio] ma niente....
Ma che cosa stai cercando di fare?
Ad ogni modo, modifica la query nel seguente modo:
In output otterrai:
StudenteID Nomi
----------- --------
A Claudio
B Sara
Andrea
Alfonso
C Luca
Roberto
>grazie mille
Prego, ma per me non stai lavorando bene
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org