Sommare i dati di più tabelle se in una delle due sono presenti dei requisiti

di il
6 risposte

Sommare i dati di più tabelle se in una delle due sono presenti dei requisiti

Buongiorno a tutti,
sono finito sul vs. forum, che trovo molto interessante, perchè sto cercando di risolvere un problema che ho con un db access.
Vi scrivo perchè con il mio amico, con cui gestisco un fantasy game sul ciclismo tramite un DB Access da lui sviluppato, abbiamo un problema a seguito di una modifica regolamentare.

Avremmo la necessità di far calcolare la classifica al DB considerando i punti ottenuti in una determinata gara solo per i ciclisti schierati dai vari partecipanti.

L'attuale struttura del DB è formata dalle seguente tabelle:

Ciclisti: Codice_ciclista; Nome_ciclista; Squadra Professione; tipo_squadra; fascia_ultimo_anno; neo pro
Rosa: Codice_ciclista; Crediti_spesi; FantaSquadra; Anno
AssegnaPunti: Codice_ciclista; Id_corsa; punti; id
Fantasquadra: ID_squadra; Fantasquadra; Allenatore, crediti a disposizione
Calendario: ID_corsa; Data_corsa; Nr_tappa; note; codice_aggregativo
AssegnaPremi: ID; Fantasquadra; punteggio; Corsa_EMC

Attualmente la classifica viene calcolata sommando i punti per ogni squadra attingendo dalle tabelle "AssegnaPunti" e "AssegniPremi".

Utilizziamo questo DB da diversi anni senza particolari problemi e negli anni siamo riusciti anche a popolare la tabella "AssegnaPunti" scaricando i dati dal sito di riferimento.

Quest'anno a seguito di una modifica regolamentare che comporta l'aumento dei dati da considerare per il calcolo della classifica abbiamo la necessità che all'interno del DB vengano caricate le formazioni di ogni squadra per ogni competizione.

Per questa tabella che chiameremo "Formazioni" avevamo pesanto ad una struttura del genere: ID; codice_ciclista; codice_aggregativo.

Come potremmo creare la query che determini la classifica per squadre leggendo dalla tabella "AssegnaPunti" i punti ottenuti e sommando solo i punti dei ciclisti che sono stati schierati nella tabella "Formazioni" per tutte le competizioni in calendario (naturalmente man manco che si popola il db nel corso dell'anno)

Se può essere utile come informazione ogni squadra ha una rosa di 30 ciclisti.

Vi ringrazio in anticipo

Neardj

6 Risposte

  • Re: Sommare i dati di più tabelle se in una delle due sono presenti dei requisiti

    Io trovo vari campi qua e là disposti male. Ripropongo la struttura secondo come la vedo io...fin dove riesco a capire qualcosa:

    Persone (perché può accogliere sia Ciclisti, sia Allenatori)
    IDPersona (PK)
    Cognome
    Nome

    Fantasquadre
    IDFantasquadra (PK)
    Fantasquadra

    RoseAnni
    IDRosa (PK)
    Anno
    IDPersona (FK)
    Ruolo (qui specifichi se si tratta di Ciclista o Allenatore)
    IDFantasquadra (FK)

    Corse
    IDCorsa (PK)
    DataCorsa
    Tappa

    Relazioni (a me chiare):
    Persone.IDPersona uno-a-molti RoseAnni.IDPersona
    Fantasquadra.IDFantasquadra uno-a-molti RoseAnni.IDFantasquadra

    Non mi è chiaro come avvengono le premiazioni, se a tutta la Fantasquadra, oppure Ciclista per Ciclista...e non so come relazionare Corse a tutto il resto del discorso.

    Riguardo tutto ciò che è calcolo e statistiche pregresse, devi demandare questi compiti tutti alle query.
  • Re: Sommare i dati di più tabelle se in una delle due sono presenti dei requisiti

    OsvaldoLaviosa ha scritto:


    Non mi è chiaro come avvengono le premiazioni, se a tutta la Fantasquadra, oppure Ciclista per Ciclista...e non so come relazionare Corse a tutto il resto del discorso.

    Riguardo tutto ciò che è calcolo e statistiche pregresse, devi demandare questi compiti tutti alle query.
    Osvaldo innanzitutto ti ringrazio per avermi risposto. Forse la maggior parte delle tabelle o dei campi posso sembrarti inutili perchè non ho spiegato nel dettaglio tutti i campi del DB.

    L'assegnazione dei punti avviente ciclista per ciclista.
    Le corse presenti in calendario sono relazionate alla tabella "assegna punti".

    La query che calcola la classifica attuale è questa:
    SELECT TFantasquadra.Fantasquadra, QPuntixCiclista.Allenatore, Sum(QPuntixCiclista.SommaDipunti) AS SommaDiSommaDipunti, QTotalePremi.SommaDipunteggio, [SommaDiSommaDipunti]+[SommaDipunteggio] AS [totale Fantasquadra]
    FROM TFantasquadra INNER JOIN (QTotalePremi INNER JOIN QPuntixCiclista ON QTotalePremi.Allenatore=QPuntixCiclista.Allenatore) ON TFantasquadra.Fantasquadra=QTotalePremi.Fantasquadra
    GROUP BY TFantasquadra.Fantasquadra, QPuntixCiclista.Allenatore, QTotalePremi.SommaDipunteggio, QPuntixCiclista.FantaSquadra
    ORDER BY Sum(QPuntixCiclista.SommaDipunti) DESC , QTotalePremi.SommaDipunteggio DESC , [SommaDiSommaDipunti]+[SommaDipunteggio] DESC;
    
    Questa è la mappa delle relazioni del database attuale:


    Hai qualche dritta su come creare la query per il calcolo della classifica nella nuova modalità che vorremmo creare?
  • Re: Sommare i dati di più tabelle se in una delle due sono presenti dei requisiti

    A una Corsa partecipano molte Fantasquadre. Una Fantasquadra partecipa a molte Corse. Quindi una relazione molti-a-molti tra queste due tabelle con tabella di congiunzione CorseFantasquadre.

    Da una Corsa scaturiscono molti Arrivi, questa tabella potrebbe avere i seguenti campi:
    IDArrivo (PK)
    Posizione (1, 2, 3,...)
    IDPersona (FK)
    IDCorsa (FK)

    Per il calcolo della Classifica...aspetta, prima ti serve sapere se l'attuale normalizzazione tabelle è funzionale.
  • Re: Sommare i dati di più tabelle se in una delle due sono presenti dei requisiti

    OsvaldoLaviosa ha scritto:


    A una Corsa partecipano molte Fantasquadre. Una Fantasquadra partecipa a molte Corse. Quindi una relazione molti-a-molti tra queste due tabelle con tabella di congiunzione CorseFantasquadre.
    Si le tutte le fantasquadre partecipano a tutte le corse se hanno ciclisti in rosa che sono al via quel giorno.

    OsvaldoLaviosa ha scritto:


    Da una Corsa scaturiscono molti Arrivi, questa tabella potrebbe avere i seguenti campi:
    IDArrivo (PK)
    Posizione (1, 2, 3,...)
    IDPersona (FK)
    IDCorsa (FK)


    Ed è quello che già fa la tabella "Assegna Punti" che contiene:
    Codice Cicista (è collegato anche alla tabella "Rosa" che assegna il ciclista alla Fantasquadra)
    ID della competizione (è univoco e che corrisponde alla gara/arrivo presente in calendario)
    Punti conquistati (sono già considerati in ordine di posizione, riusciamo a scaricarli in automantico dal sito di riferimento)

    OsvaldoLaviosa ha scritto:


    Per il calcolo della Classifica...aspetta, prima ti serve sapere se l'attuale normalizzazione tabelle è funzionale.

    Scusa la mia ignoranza. Per normalizzazione tabelle intendi la tua proposta di modifica della struttura tabelle del database?
  • Re: Sommare i dati di più tabelle se in una delle due sono presenti dei requisiti

    neardj ha scritto:


    Si le tutte le fantasquadre partecipano a tutte le corse se hanno ciclisti in rosa che sono al via quel giorno.
    Aspetta, qui dobbiamo modificare qualcosa. Occorre una relazioni Persone molti-a-molti Corse con tabella di congiunzione PartecipantiCorse con i seguenti campi:
    IDPC (PK)
    IDPersona (FK)
    Arrivo (qui indichi la posizione di Arrivo)
    IDCorsa (FK)

    Questa tabella non importa se la compili in un ordine diverso dagli Arrivi. Puoi sempre ordinarla diversamente poi.

    neardj ha scritto:


    Scusa la mia ignoranza. Per normalizzazione tabelle intendi la tua proposta di modifica della struttura tabelle del database?
    La normalizzazione è una serie di regole che servono a "ottimizzare" (ossia normalizzare) le tabelle in modo che non vi siano ridondanze, campi ripetuti, tabelle con campi simili e tanto altro ancora. Spiegarla teoricamente è una "mappazza" che neanche io saprei farlo. Il modo meno doloroso di affrontarlo è quello di guardare "strutture tabelle", come sono fatti i dati, quello di cui si ha bisogno di tracciare...e tanto buon senso.
  • Re: Sommare i dati di più tabelle se in una delle due sono presenti dei requisiti

    OsvaldoLaviosa ha scritto:


    neardj ha scritto:


    Si le tutte le fantasquadre partecipano a tutte le corse se hanno ciclisti in rosa che sono al via quel giorno.

    Arrivo (qui indichi la posizione di Arrivo)
    Questa tabella non importa se la compili in un ordine diverso dagli Arrivi. Puoi sempre ordinarla diversamente poi.
    Questo campo non potrebbe essere sostuito dai punti coquistati? Se inserisco l'ordine d'arrivo come fa il db a sapere quanti punti attribuire? I punti variano da gara a gara.

    neardj ha scritto:


    Scusa la mia ignoranza. Per normalizzazione tabelle intendi la tua proposta di modifica della struttura tabelle del database?
    La normalizzazione è una serie di regole che servono a "ottimizzare" (ossia normalizzare) le tabelle in modo che non vi siano ridondanze, campi ripetuti, tabelle con campi simili e tanto altro ancora. Spiegarla teoricamente è una "mappazza" che neanche io saprei farlo. Il modo meno doloroso di affrontarlo è quello di guardare "strutture tabelle", come sono fatti i dati, quello di cui si ha bisogno di tracciare...e tanto buon senso.
    Ok. Ho capito
Devi accedere o registrarti per scrivere nel forum
6 risposte