Da sql a network matrix

di
Anonimizzato13051
il
9 risposte

Da sql a network matrix

Cari amici,

sono un ricercatore di management con un passato (arruginito) da informatico. Ho un database in sql access da cui devo estrarre alcuni dati da poter essere utilizzati da programmi di network analysis. Il punto è che non so se e come sia possibile estrarli efficacemente tramite apposite query.

Devo creare una serie di 10 tabelle (una per ogni anno dal 1997 al 2006) composte da:
- righe id_cantina (tutte le cantine presenti nei 10 anni, in tutte le cantine annuali) e sulle colonne tutti gli Id_eno (tutti gli enologi presenti nei 10 anni per tutti gli anni)

es: nell'anno 97 (nuova tabelle creata per quell'anno) la casella che avrà sulle righe idcantina (con valore n) e sulle colonne id_eno(con valore m) dovrà essere riempita con 1 se c'è una relazione fra cantina e enologo in quell'anno (le relazioni si trovano nella tabella consulenza), con 0 se entrambi sono presenti in quell'anno ma non v'è relazione, con 10 se la cantina e/o l'enologo non è presente nell'anno. ovviamete si meterà a 10 tutta la riga della cantina o dell'enologo.

tabelle del db da cui estrarre i dati:

ENOLOGO: tabella con tutti gli enologi presenti nei 10 anni composta da codice (id_eno), nome, cognome, in pratica bisogna copiare la colonna ideno e metterla sulla prima riga delle nuove tabelle (tipo da intestazione).


CANTINA: come enologo con colonne id_cantina, reg, prov, anche qui la nuova tabella avrà come come prima colonnna tutti gli id_cantina presenti nella tabella.

CONSULENZA: formata da id_eno, id_cantina, anno; è praticamente una "join" di cantina ed enologo che indica l'anno di collaborazione

Il risultato che vorrei ottenere è qualcosa di simile a questo:

X 1 2 3 4 5 6

1 1 1 0 0 10 0

2 0 0 0 1 10 0

3 10 10 10 10 10

4 1 0 0 0 10 0

5 0 0 0 0 10 1

spiegazione: nuova tabella anno 97, sappiamo che in tutti i dieci anni abbiamo avuto 6 enologi e 5 cantine; di questi nel 97, la cantina 3 non esisteva e l'enologo 5 non ha lavorato.
la cantina 1 aveva due enologi (1 e 2) e le altre solo uno.

Dovrebbe venire una cosa così. come posso fare?
Non sono certo si riesca a fare tutto in sql, magari bisogna preparere fuori la tabella vuota con solo enologi sulle colonne e cantine sulle righe, poi importarla e riempirla.

Spero qualcuno riesca ad illuminarmi!
Grazie in anticipo per l'aiuto!

Marco

9 Risposte

  • Re: Da sql a network matrix

    A me tutto il discorso appare molto farraginoso. Le 3 tabelle Cantine, Enologi e Consulenze sono state impostate abbastanza correttamente (io avrei incluso un campo IDConsulenza come chiave primaria della omonima tabella). Spero tu abbia creato correttamente le relazioni:
    Cantine.IDCantina uno-a-molti con Consulenze.IDCantina
    Enologi.IDEnologo uno-a-molti con Consulenze.IDEnologo.
    Tutto il resto del discorso va affrontato con opportune query...ora non mi è chiaro perchè ti preoccupi se nell'anno 1998 non esisteva la Cantina X oppure non ci sia stata consulenza del Consulente Y. Forse nel creare le query e, volendo contabilizzare sempre e comunque tutte le Annate, si tratterebbe di modificare la proprietà join da tipo 1 a tipo 2 (Includi tutti i campi della tabella madre e solo i campi della tabella figlia che sono correlati)...oppure di tipo 3 (Includi tutti i campi della tabella figlia e solo i campi della tabella madre che sono correlati)...però sto buttando idee senza aver compreso nel pieno il tuo quesito.
  • Re: Da sql a network matrix

    [Segnalazione cross posting]
  • Re: Da sql a network matrix

    Innanzitutto grazie per la rapida risposta, cercherò di essere più chiaro e specifico.

    1) Si, le tabelle sono "corrette" (nel senso che sono in 3° forma normale con appropriata integrità referenziale); il codice da te consigliato non l'ho ritenuto necessario perché comunque id_cantina, id_eno, anno è già chiave primaria, ma non è questo il focus della domanda, comunque grazie per averlo chiesto.

    2) il mio problema non è tanto capire come fare le join fra queste tabelle ma capire se in sql si può creare (o importare ed usare) una tabella con un "diverso" formato da quelle elencate e cioè che abbia sulle righe le cantine e sulle colonne invece che attributi di cantine o attributi derivanti da join, gli enologi (i codici). Lo scopo è quindi creare questa tabella diciamo "binaria" (se per ora non consideriamo i missing), in cui io si abbia 1 o 0 a seconda della connessione fra cantina ed enologo derivabile dalla tabella consulenza nell'anno indicato.

    3) non sono sicuro che sql sia il modo migliore (o possibile di farlo), magari è meglio farmi due fogli excell uno con la tabella consulenza così com'è e uno con la nuova tabella e riempire le cella con una funzione if o for o qualcosa che mi permetta di ottenere quel risultato; oppure è meglio fare un programma in c con due matrici e qualche ciclo? non so. Preferirei al massimo con excell perchè ormai non ho più compilatori e non sono tanto competente in altri linguaggi, ma se avete idee a riguardo sono tutto orecchi!
  • Re: Da sql a network matrix

    Ciao romualdo85, su questo forum come da regolamento non consentiamo che si replichino post pubblicati anche su altri forum (cross posting).
    Se vuoi continuare il 3d su questo forum accertati che non ci siano repliche altrove.
    Se vuoi continuare il 3d altrove, questo lo chiudiamo.

  • Re: Da sql a network matrix

    Grazie Toki, ho fatto cancellare l'altro. Spero la discussione possa continuare.
  • Re: Da sql a network matrix

    OK che la discussione continui!
  • Re: Da sql a network matrix

    Secondo me devi approcciare con un operazione PIVOT che mi sembra caschi a fagiulo.

    Documentati sulle tabelle pivot, per quanto riguarda MS Access, prova a leggere:
    http://office.microsoft.com/it-it/access-help/creare-visualizzazioni-tabella-pivot-o-grafico-pivot-in-un-database-desktop-HA101901543.aspx
  • Re: Da sql a network matrix

    Ok, le pivot non le ho mai usate, ma ci dò un'occhiato, poi vi farò sapere se funziona!
  • Re: Da sql a network matrix

    Salve a tutti.. sto ancora provando, ma per ora niente.
    Sono abbastanza sicuro che mi serva una "maxy"-query prima di passare dalla tabella pivot.
    Credo che la query giusta per ottenere i dati di cui sopra sia la seguente:

    Select distinct an.id_anno, qy.enologo, qy.cantina
    From anno an
    Left outer join
    (Select co.anno, co.id_cantina,en.id_eno
    From enologo en
    Left outer join consulenza co on co.id_eno = en.id_eno
    Union
    ( Select co.anno, ca.id_cantina, co.id_eno
    From cantina ca
    Left outer join consulenza co on co.id_cantina = ca.id_cantina
    ) qy on qy.anno = an.id_anno
    Where an.id_anno = 1997 or an.id_anno is null;

    Problema: access mi dà un'errore sulla join evidenziando l'ultimo "on" e non riesco a capire il perchè.
    Qualche idea?
Devi accedere o registrarti per scrivere nel forum
9 risposte