Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    comando sql

    Salve ragazzi
    Non sono un programmatore, ma mi sono trovato di dover utilizzare SQL per estrarre dati dal mio database per fare una mailing list ai nostri clienti.
    Il problema è il seguente:

    ho due tabelle:

    tabella 1: “clienti”
    codice anagrafica
    01 Luca
    02 Paolo
    03 Sergio

    tabella 2: “contatti”
    codice tipo contatto
    01 1 0244556677
    01 2 0266558844
    01 3 luca@luca.com
    02 1 0388778855
    02 3 paolo@paolo.com
    03 1 0455887744
    03 2 0477885522
    03 3 sergio@sergio.com

    in questo esempio ci sono solo 3 record, nel database vero ci sono piu di 1000, come vedete il telefono, fax, email sono divisi per riga e non per colonna con una colonna aggiuntiva che distingue il tipo, per estrarre i dati uso questo commando:

    select anagrafica,contatto from clienti,contatti where codice.clienti=codice.contatti and tipo.contatti=1

    usando questo commando il risultato è il seguente:
    Luca 0244556677
    Paolo 0388778855
    Sergio 0455887744

    Se invece cambio tipo.contatti a 2 mi vengono fuori le mail
    Luca luca@luca.com
    Paolo paolo@paolo.com
    Sergio sergio@sergio.com

    La mia domanda è: come faccio a far venire fuori tutte 4 le colonne con un solo commando?????

    Luca 0244556677 0266558844 luca@luca.com
    Paolo 0388778855 paolo@paolo.com
    Sergio 0455887744 0477885522 sergio@sergio.com


    Grazie del vostro aiuto.

    Luis
    -----------------
    R.I.P. Kurt Cobain

  2. #2
    ciao,
    una cosa del genere dovrebbe andare:

    codice:
    SELECT
        c.anagrafica
        ,t.contatto AS telefono
        ,f.contatto AS fax
        ,e.contatto AS email
    FROM
    (
    (
        clienti AS c
    LEFT JOIN
        contatti AS t
    ON 
        (c.codice = t.codice AND t.tipo = 1)
    )
    LEFT JOIN
        contatti AS f
    ON 
        (c.codice = f.codice AND f.tipo = 2)
    )
    LEFT JOIN
        contatti AS e
    ON 
        (c.codice = e.codice AND e.tipo = 3)
    WHERE
        t.codice IS NOT NULL
    OR
        f.codice IS NOT NULL
    OR 
        e.codice IS NOT NULL
    potrebbero esserci dei problemi sulle parentesi, prova (non hai specificato il db che usi e per ex access è un po' capriccioso su queste mentre altri sono più di manica larga)

    xxx

  3. #3
    grazie mille della tua risposta, domani mattina la provo subito
    sto usando sql server 2005, quello che viene fornito con Win SBS 2003,

    ciao e grazie ancora

    Luis
    -----------------
    R.I.P. Kurt Cobain

  4. #4
    funziona perfettamente, grazie ancora.

    Luis
    -----------------
    R.I.P. Kurt Cobain

  5. #5
    ben contento ti sia stato utile.

    solo un dubbio, ma per un utente possono esserci più elementi dello stesso tipo? (ex 2 numeri di telefono, due fax, due mail)?
    Se così non è, visto che usi sql server 2005 potresti pensare di utilizzare anche la nuova funzione PIVOT di sql server 2005 (non so dirti a priori quale sia la più veloce):

    codice:
    SELECT
    	c.codice,
    	c.anagrafica,
    	[1] AS telefono,
    	[2] AS fax,
    	[3] AS mail
    FROM
    	clienti AS c
    INNER JOIN
    	(
    		SELECT 
    			* 
    		FROM 
    			contatti
    	) AS s
    PIVOT
    	(
    		MAX(contatto)
    		FOR 
    		tipo IN ([1],[2],[3])
    	) AS p
    ON
    	c.codice = p.codice
    la mia prima query se un cliente ha 2 numeri di telefono tira fuori 2 righe duplicando gli altri dati.
    questa tira fuori solo una riga e un numero (il più grande nell'esempio, ma solo perché pivot vuole una funzione di aggregazione).

    con un po' di lavoro, se un utente ha due numeri di telefono, si può creare una funzione di aggregazione che concateni i risultati, da utilizzare con il pivot. occorre però sfruttare CLR e scrivere qualche riga di codice in c#/vb.net.

    xxx

  6. #6
    fortunatamente hanno tutti un solo numero di telefono, al massimo hanno il cellulare ma che è impostato come tipo 4, quindi non viene fuori.
    la seconda query non funziona xche mi dice che il database non ha il livello di compatibilita con la funzione PIVOT.
    comunque con la prima query mi basta e avanza, ti ringrazio ancora.
    sono in debito con te!

    Luis
    -----------------
    R.I.P. Kurt Cobain

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.