Cursori? Table? AIUTO!!!!!

martedì 22 luglio 2008 - 16.34

allevaldo Profilo | Junior Member

cerco di spiegare al meglio il mio problema.
ho due tabelle. faccio un esempio simile per farvi capire. una dati anagrafici. una che contiene i numeri di telefono. una riga per ogni numero di telefono. la seconda tabella
contiene una chiave esterna per collegarla all aprima (non chiedetevi perchè sono fatte così!)
sto creando una stored che interroga le tabella.
Se faccio una semplice join tra le due, mi ritorna giustamente una riga per ogni numero di telefono associato alla persona, con però tutti gli altri dati uguali.
Io avrei bisogno di avere invece 1 riga per ogni persona e, se possibile, inserire i dati ritornati dalla seconda tabella in un unico campo (caso mai divisi da un carattere ";")
ossia

le colonne del risultato sarebbero: nome, cognome,...., telefono, dove telefono contiene 1223455;1234453;2373373;

è POSSIBILE?

Dainesi Profilo | Senior Member

Basta che definisci il campo come un Alias. Ovvero " ... [Nome] + ' ' + [Cognome] + ' (Tel. : ' + [Telefono] + ')' AS Contatto FROM ..."

allevaldo Profilo | Junior Member

no... mi sa che o mi sono spiegato male... o non hai capito.
dalla tabella dei numeri di telefono possono essere estratte anche + righe per ogni persona.
quindi sarebbe veramente inutile concatenare due campi con un AS... visto che i campi numeri di telefono non sono sulla stessa riga...

la tabella numeri di tel non è strutturata come numero1, numero2, numero3...
per ogni riga c'è un unico numero di telefono... (che può essere privato etc.... )

quindi la join sarebbe
tizio | numero1
tizio | numero2
tizio | numero3
caio | numero1
caio | numero2
...
io vorrei:
tizio | numero1;numero2;numero3
caio | numero1;numero2
...

Dainesi Profilo | Senior Member

Ora è più chiaro. Peccato che mi sà che quello che cerchi non è realizzabile con una query (SE & O).

Esiste una soluzione via codice:

- Esegui la tua join select ordinata per Nome.
- Ogni volta che devi "riempire" il campo Telefono (quello che tu volevi frutto di una concatenazione) confronti se il record successivo si riferisce allo stesso nominativo e se si aggiungi (concateni i numeri di telefono separandoli da un punto e virgola) mentre in caso contrario chiudi la riga e passi alla successiva inserendo il prossimo nome.

lbenaglia Profilo | Guru

>è POSSIBILE?
Dipende
Se utilizzi SQL Server troverai diverse soluzioni in questo thread:
http://groups.google.it/group/microsoft.public.it.sql/msg/8887e519f7eb28a1

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

allevaldo Profilo | Junior Member

grazie... ma non capisco come posso sfruttare il codice postato dovendo mettere in join due tabelle...

quella del pivoting mi sembra davvero interessante... ma come c'è da crearsi una tabella temporanea e io dovrei riempirla con dati presi da una select...

tipo "select campo1, campo2, campo3 from tabella where ID= tabellamaster.ID" perchè deve diventare una colonna del risultato totale.
(che fatica spiegare sta cosa :-))

riassumo.
select .... from tabella_master inner join tabella_slave on Id=id
però così mi saltano fuori (giustamente) 1 record per ogni dato diverso che trova nella tabella slave, duplicano però gli altri.

postarmi un codice di esempio no?

lbenaglia Profilo | Guru

>postarmi un codice di esempio no?
Postare tu i comandi di CREATE TABLE e di INSERT INTO per le due tabelle seguito dal result set che vuoi ottenere, no?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

allevaldo Profilo | Junior Member

allora... la tabella contenente i numeri tel
CREATE TABLE [TB_TELEFONO](
[COD_CLIENTE] [int] NOT NULL,
[TIPO_TEL] [char](2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[PREF_STATO] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[PREFISSO] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[NUMERO] [char](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
)
la tabella "master":
CREATE TABLE [TB_DATI](
[COD_CLIENTE] [int] NOT NULL,
[NOMINATIVO] [nchar](180) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[INDIRIZZO][nchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
)

ok queste sono le due tabelle.

facendo una join tra le due... o con qualsiasi altra cosa... io vorrei
COD_CLIENTE, NOMINATIVO, INDIRIZZO, NUMERO
dove numero è un unica colonna che contiene tutti i numeri di telefono presenti nella prima tabella associati a
quel codice cliente, divisi da un qualsiasi carattere.

più chiaro così?

lbenaglia Profilo | Guru

>ok queste sono le due tabelle.
Mancano i comandi INSERT INTO ed il result set che vuoi ottenere con quei dati di esempio.

>più chiaro così?
Potresti essere ancora più chiaro fornendo i dati che ti vengono chiesti

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

allevaldo Profilo | Junior Member

qualcosa di questo tipo

INSERT INTO TB_DATI(cod_cliente, nominativo, indirizzo) VALUES (1, 'nominativo1','indirizzo1');
INSERT INTO TB_DATI(cod_cliente, nominativo, indirizzo) VALUES (2, 'nominativo2','indirizzo2');
INSERT INTO TB_DATI(cod_cliente, nominativo, indirizzo) VALUES (3, 'nominativo3','indirizzo3');

INSERT INTO TB_TELEFONO(cod_cliente, tipo_tel, pref_stato, prefisso, numero) VALUES (1, 'CE','0039','123','123456');
INSERT INTO TB_TELEFONO(cod_cliente, tipo_tel, pref_stato, prefisso, numero) VALUES (1, 'CA','0039','0522','123456');
INSERT INTO TB_TELEFONO(cod_cliente, tipo_tel, pref_stato, prefisso, numero) VALUES (1, 'LA','0039','0522','234567');
INSERT INTO TB_TELEFONO(cod_cliente, tipo_tel, pref_stato, prefisso, numero) VALUES (2, 'CE','0039','123','1234555');
INSERT INTO TB_TELEFONO(cod_cliente, tipo_tel, pref_stato, prefisso, numero) VALUES (2, 'CA','0039','059','123456');

dalla select vorrei ottenere
1, "nominativo1","indirizzo1","CE0039123123456;CA00390522123456;LA00390522234567"
2, "nominativo2","indirizzo2","CE00391231234555;CA0039059123456"
3, "nominativo3","indirizzo3"






lbenaglia Profilo | Guru

>qualcosa di questo tipo
<SNIP>

Nel seguente esempio per SQL Server 2005 ho modificato i data type delle colonne stringa, utilizzando quando opportuno varchar ed eliminando i data type unicode.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5