Quesito schema db + trasporre righe in colonne

di il
4 risposte

Quesito schema db + trasporre righe in colonne

Buongiorno a tutti,
dopo moooolto tempo ho ripreso a programmare e devo realizzare un piccolo applicativo in Access 2010 per gestire le sedute di una commissione i cui membri appartengono a quattro enti (chiamiamoli E1, E2, E3, E4) . Quando la commissione si riunisce questa è composta da quattro membri (uno per ciascun ente) ma solo quelli dell'Ente E1 possono ricoprire il ruolo di Presidente.

Le tabelle su cui ora sto lavorando sono :

MEMBRO (idmembro, cognome, nome, tipo) [tipo è il campo discriminante che indica il tipo di ente cui il membro appartiene)
PARTECIPAZIONE (idmembro, idseduta)
SEDUTA (idseduta, data)

L'alternativa (che però non mi piace tanto) prevede la sostituzione delle tabelle Partecipazione e Seduta con una sola tabella SedutaCommissione (IdSeduta, Data , IdPresidente, IdMembroEnte2, IdMembroEnte3, IdMembroEnte4)

Prima domanda :
concordate sulla struttura delle tre tabelle? avete alternative?

Seconda domanda:
Date le tabelle

PARTECIPAZIONE
IdSeduta-IdMembro
1----------1
1----------2
1----------3
1----------4

MEMBRO
IdMembro-Cognome-Nome-Tipo
1------------A----A-----E1
2------------B----B-----E2
3------------C----C-----E3
4------------D----D-----E4

vorrei scrivere una query per avere il seguente risultato , ma sono proprio arrugginito:
IdSeduta-IdMembroE1-NomeMembroE1-IdMembroE2-NomeMembroE2-IdMembroE3-NomeMembroE3-IdMembroE4-NomeMembroE4
1----------1---------------A A--------------2-----------------B B----------------3---------------C C -----------------4-------------D D

Spero in un vostro aiuto.

Grazie.

4 Risposte

  • Re: Quesito schema db + trasporre righe in colonne

    liuc ha scritto:


    Prima domanda :concordate sulla struttura delle tre tabelle? avete alternative?
    Perchè non hai previsto una tabella Enti? Io ci avrei messo lì un campo Sì/No per stabilire se un Ente è "Presidenzievole" (scusa il termine non ortodosso) oppure no.
    Se Rossi Mario oggi appartiene a E2, l'anno prossimo può accadere che appartenga a E3? Nel frattempo Brambilla Carlo può cambiare da E2 in E1?
  • Re: Quesito schema db + trasporre righe in colonne

    Ciao, per rispondere alla tua domanda i membri non transitano da un ente all'altro. In totale ci saranno una ventina di membri (fra tutti e quattro gli enti) che a turno andranno a comporre la commissione in ciascuna seduta. L'idea della tabella Enti è da valutare, inizialmente avevo previsto una tabella Ruolo (con il medesimo significato in realtà) , ma per avere query più snelle (evitare altre join) l'ho eliminata pensando ad un flag che mi distinguesse l'appartenenza di una persona.

    Ho dimenticato di aggiungere una cosa importante: tra i membri che appartengono all'ente E1 uno è nominato come Presidente, quando egli è assente il ruolo è ricoperto da uno degli altri membri dello stesso ente ma con il ruolo di Presidente Supplente. Nel verbale della riunione (che poi tiro fuori con una stampa unione) deve essere riportata questa informazione (Presidente, Presidente Supplente).

    Resta cmq la questione della query per trasformare le quattro righe di ciascuna seduta in una sola .

    Grazie per l'intervento , ad ogni modo.
  • Re: Quesito schema db + trasporre righe in colonne

    La tabella Enti non è strettamente necessaria. Come hai impostato tu può andare lo stesso.
    Ti consiglio di nominare i nomi tabelle al PLURALE, i nomi campo al SINGOLARE.
    La struttura tabelle, come minimo indispensabile, va bene.

    Per la seconda domanda, non sono sicuro se si può ottenere con una query. Di sicuro devi ciclare un RECORDSET (quindi usare un codice VBA). In situazioni come questa io faccio migrare quei valori in una tabella di appoggio che mostra i dati nel modo come li vuoi tu.
  • Re: Quesito schema db + trasporre righe in colonne

    Grazie per i consigli.
    Per la query ho risolto seguendo i suggerimenti di un altro forum. Riporto di seguito il codice nel caso possa interessare qualcun altro:
    SELECT 
    SEDUTA.idseduta, 
    Max(IIf([tipo]="E1",[idmebro])) AS IdMembroE1, 
    Max(IIf([tipo]="E1",[cognome])) AS CognomeMembroE1, 
    Max(IIf([tipo]="E1",[nome])) AS NomeMembroE1, 
    Max(IIf([tipo]="E2",[idmebro])) AS IdMembroE2, 
    Max(IIf([tipo]="E2",[cognome])) AS CognomeMembroE2, 
    Max(IIf([tipo]="E2",[nome])) AS NomeMembroE2, 
    Max(IIf([tipo]="E3",[idmebro])) AS IdMembroE3, 
    Max(IIf([tipo]="E3",[cognome])) AS CognomeMembroE3, 
    Max(IIf([tipo]="E3",[nome])) AS NomeMembroE3, 
    Max(IIf([tipo]="E4",[idmebro])) AS IdMembroE4, 
    Max(IIf([tipo]="E4",[cognome])) AS CognomeMembroE4, 
    Max(IIf([tipo]="E4",[nome])) AS NomeMembroE4
    FROM 
    SEDUTA 
    INNER JOIN 
    (
    MEMBRO 
    INNER JOIN 
    PARTECIPAZIONE 
    ON 
    MEMBRO.idmebro = PARTECIPAZIONE.idmembro
    ) 
    ON 
    SEDUTA.idseduta = PARTECIPAZIONE.idseduta
    GROUP BY 
    SEDUTA.idseduta
    
    Grazie.
Devi accedere o registrarti per scrivere nel forum
4 risposte