Discussione:
Sommare i dati di più tabelle se in una delle due sono presenti dei requisiti
(troppo vecchio per rispondere)
Neardj
2019-01-24 08:36:54 UTC
Permalink
Buongiorno a tutti,
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
Geremia
2019-01-24 22:17:00 UTC
Permalink
Post by Neardj
Buongiorno a tutti,
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.
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
il campo codice di aggregazione cosa rappresenta?
L'attuale query che calcola la classifica puoi postarla? Giusto per
capire la struttura del db ( non è sufficiente l'elenco campi senza le
relazioni e il tipo dato.... L'ideale sarebbe pubblicare il db ridotto,
cioè solo con qualche record per tabella privo dei dati sensibili...)
Neardj
2019-01-24 22:56:55 UTC
Permalink
Post by Geremia
Post by Neardj
Buongiorno a tutti,
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.
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
il campo codice di aggregazione cosa rappresenta?
L'attuale query che calcola la classifica puoi postarla? Giusto per
capire la struttura del db ( non è sufficiente l'elenco campi senza le
relazioni e il tipo dato.... L'ideale sarebbe pubblicare il db ridotto,
cioè solo con qualche record per tabella privo dei dati sensibili...)
Geremia ti ringrazio innanzitutto per la risposta.
La query della 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;

qui puoi vedere le relazioni del db:
Loading Image...
Neardj
2019-01-25 06:42:45 UTC
Permalink
Dimenticavo il campo codice aggregazione serve per raggruppare le corse a tappe presenti nel calendario.
Fino ad oggi il calendario prevede un ID gara diverso per ogni singola gara attribuito tutte le gare a cui partecipiamo. Questo accade anche per le corse a tappe come il giro d'Italia dove sono presenti 42 record in calendario a rappresentare le singole tappe e maglie di giornata. Visto che la formazione si schiera prima dell'inizio della gara abbiamo pensato di aggiungere questa nuova colonna "codice aggregazione" da utilizzare come identificato per l'importazione delle formazioni e il calcolo della classifica. Visto che ogni rosa è composta da 30 ciclisti ma per ogni gara è possibile schierare solo 9 potrebbe accadere che vadano a punti anche ciclisti che non sono stati schierati. In quel caso la Classifica dovrebbe sommare solo i punti che comprendono sia il codice ciclista che il codice aggregazione escludendo di fatto i non schierati
Geremia
2019-01-25 22:35:00 UTC
Permalink
Post by Neardj
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;
credo che la modifica vada fatta a monte, cioè nella query QPuntixCiclista
Geremia
2019-01-25 22:34:20 UTC
Permalink
Post by Neardj
Per questa tabella che chiameremo "Formazioni" avevamo pesanto ad una struttura del genere: ID; codice_ciclista; codice_aggregativo.
ma nella tabella non ci andrebbe anche l'id gara? non basta il codice
aggregativo,che è comune a piu gare secondo quanto scrivi....
Un ciclista potrebbe partecipare a sole tre gare di dieci aventi il
medesimo cod aggregativo
Neardj
2019-01-26 07:32:30 UTC
Permalink
Post by Geremia
Post by Neardj
Per questa tabella che chiameremo "Formazioni" avevamo pesanto ad una struttura del genere: ID; codice_ciclista; codice_aggregativo.
ma nella tabella non ci andrebbe anche l'id gara? non basta il codice
aggregativo,che è comune a piu gare secondo quanto scrivi....
Un ciclista potrebbe partecipare a sole tre gare di dieci aventi il
medesimo cod aggregativo
Il problema di inserire il campo "id_gara" nella tabella "Formazioni" è dato dal fatto che aumenterebbe il numero di record nell'importazione dei vari ciclisti schierati per una x gara a tappe.

Faccio un esempio:

Giro di Paperopoli (7 tappe) cod. aggregativo per tutte le tappe 18
1 Tappa - Id gara = 1
2 Tappa - Id gara = 2
3 Tappa - Id gara = 3
4 Tappa - Id gara = 4
5 Tappa - Id gara = 5
6 Tappa - Id gara = 6
7 Tappa - Id gara = 7
Classifica Generale - Id gara = 8

L'invio formazione dovrebbe prevedere la creazione di 8 record per ciascun codice ciclista .
Mettiamo che io voglia schierare anche un solo ciclista e con la struttura tabella id gara dovrebbe venir fuori una cosa così:

codice ciclista, id gara, codice aggregativo
501, 1, 18
501, 2, 18
501, 3, 18
501, 4, 18
501, 5, 18
501, 6, 18
501, 7, 18
501, 8, 18

Sarebbero 8 record per un solo ciclista , 72 record se la squadra riuscisse a schierarne 9 per quella gara e 792 record per tutte le squadre partecipanti.

Per questo pensavamo di inserire il "codice aggregativo" da utilizzare per il calcolo della classifica. In questo modo l'invio formazione sarebbe solo così:
501, 18
Geremia
2019-01-26 11:29:59 UTC
Permalink
Post by Neardj
Post by Geremia
Post by Neardj
Per questa tabella che chiameremo "Formazioni" avevamo pesanto ad una struttura del genere: ID; codice_ciclista; codice_aggregativo.
ma nella tabella non ci andrebbe anche l'id gara? non basta il codice
aggregativo,che è comune a piu gare secondo quanto scrivi....
Un ciclista potrebbe partecipare a sole tre gare di dieci aventi il
medesimo cod aggregativo
Il problema di inserire il campo "id_gara" nella tabella "Formazioni" è dato dal fatto che aumenterebbe il numero di record nell'importazione dei vari ciclisti schierati per una x gara a tappe.
Giro di Paperopoli (7 tappe) cod. aggregativo per tutte le tappe 18
1 Tappa - Id gara = 1
2 Tappa - Id gara = 2
3 Tappa - Id gara = 3
4 Tappa - Id gara = 4
5 Tappa - Id gara = 5
6 Tappa - Id gara = 6
7 Tappa - Id gara = 7
Classifica Generale - Id gara = 8
L'invio formazione dovrebbe prevedere la creazione di 8 record per ciascun codice ciclista .
codice ciclista, id gara, codice aggregativo
501, 1, 18
501, 2, 18
501, 3, 18
501, 4, 18
501, 5, 18
501, 6, 18
501, 7, 18
501, 8, 18
Sarebbero 8 record per un solo ciclista , 72 record se la squadra riuscisse a schierarne 9 per quella gara e 792 record per tutte le squadre partecipanti.
501, 18
Scritta così quindi è implicito che il ciclista 501 è stato schierato in
TUTTE le 7+1 tappe del giro di Paperopoli?
Neardj
2019-01-26 11:38:27 UTC
Permalink
Post by Geremia
Post by Neardj
Post by Geremia
Post by Neardj
Per questa tabella che chiameremo "Formazioni" avevamo pesanto ad una struttura del genere: ID; codice_ciclista; codice_aggregativo.
ma nella tabella non ci andrebbe anche l'id gara? non basta il codice
aggregativo,che è comune a piu gare secondo quanto scrivi....
Un ciclista potrebbe partecipare a sole tre gare di dieci aventi il
medesimo cod aggregativo
Il problema di inserire il campo "id_gara" nella tabella "Formazioni" è dato dal fatto che aumenterebbe il numero di record nell'importazione dei vari ciclisti schierati per una x gara a tappe.
Giro di Paperopoli (7 tappe) cod. aggregativo per tutte le tappe 18
1 Tappa - Id gara = 1
2 Tappa - Id gara = 2
3 Tappa - Id gara = 3
4 Tappa - Id gara = 4
5 Tappa - Id gara = 5
6 Tappa - Id gara = 6
7 Tappa - Id gara = 7
Classifica Generale - Id gara = 8
L'invio formazione dovrebbe prevedere la creazione di 8 record per ciascun codice ciclista .
codice ciclista, id gara, codice aggregativo
501, 1, 18
501, 2, 18
501, 3, 18
501, 4, 18
501, 5, 18
501, 6, 18
501, 7, 18
501, 8, 18
Sarebbero 8 record per un solo ciclista , 72 record se la squadra riuscisse a schierarne 9 per quella gara e 792 record per tutte le squadre partecipanti.
501, 18
Scritta così quindi è implicito che il ciclista 501 è stato schierato in
TUTTE le 7+1 tappe del giro di Paperopoli?
Si perché ogni allenatore schiera i ciclisti prima della tappa n. 1 e non può più modificarli.
Geremia
2019-01-26 21:53:49 UTC
Permalink
Post by Neardj
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.
modificare la query che calcola i punti ciclisti, ad esempio aggiungendo
un test sulla tabella formazioni :

select a.Codice_ciclista, sum(isnull(a.punti, 0)) as sommapunticiclista
from AssegnaPunti a
inner join formazioni f
on a.Codice_ciclista = f.codice_ciclista
Neardj
2019-01-30 17:17:28 UTC
Permalink
Post by Geremia
Post by Neardj
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.
modificare la query che calcola i punti ciclisti, ad esempio aggiungendo
select a.Codice_ciclista, sum(isnull(a.punti, 0)) as sommapunticiclista
from AssegnaPunti a
inner join formazioni f
on a.Codice_ciclista = f.codice_ciclista
Il mio amico a seguito dei tuoi suggerimenti ha modificato la query di calcolo così:

SELECT TCiclisti.Nome_ciclista, TRosa.FantaSquadra, TFantasquadra.Allenatore, Sum(TAssegnaPunti.punti) AS SommaDipunti
FROM TFantasquadra INNER JOIN (TCiclisti INNER JOIN (TAssegnaPunti INNER JOIN (TInvioFormazioni INNER JOIN TRosa ON TInvioFormazioni.Codice_ciclista=TRosa.Codice_ciclista) ON (TAssegnaPunti.Codice_ciclista = TInvioFormazioni.Codice_ciclista) ON (TCiclisti.Codice_ciclista=TAssegnaPunti.Codice_ciclista) AND (TCiclisti.Codice_ciclista = TInvioFormazioni.Codice_ciclista) and (TCiclisti.Codice_ciclista=TRosa.Codice_ciclista) ON TFantasquadra.ID_squadra=TRosa.FantaSquadra
GROUP BY TCiclisti.Nome_ciclista, TRosa.FantaSquadra, TFantasquadra.Allenatore
ORDER BY Sum(TAssegnaPunti.punti) DESC;

ma c'è sicuramente un errore di sintassi perchè un validatore online dice che dovrebbe essere in questa parte qui:

ON (
TCiclisti.Codice_ciclista = TAssegnaPunti.Codice_ciclista
)

e di conseguenza la query non funziona.

La vecchia query funzionante che però non teneva in considerazione le formazioni inviati era questa:


SELECT TCiclisti.Nome_ciclista, TRosa.FantaSquadra, TFantasquadra.Allenatore, Sum(TAssegnaPunti.punti) AS SommaDipunti
FROM TFantasquadra INNER JOIN (TCiclisti INNER JOIN (TAssegnaPunti INNER JOIN TRosa ON TAssegnaPunti.Codice_ciclista=TRosa.Codice_ciclista) ON (TCiclisti.Codice_ciclista=TAssegnaPunti.Codice_ciclista) AND (TCiclisti.Codice_ciclista=TRosa.Codice_ciclista)) ON TFantasquadra.ID_squadra=TRosa.FantaSquadra
GROUP BY TCiclisti.Nome_ciclista, TRosa.FantaSquadra, TFantasquadra.Allenatore
ORDER BY Sum(TAssegnaPunti.punti) DESC;
Geremia
2019-01-30 21:43:37 UTC
Permalink
Post by Neardj
SELECT TCiclisti.Nome_ciclista, TRosa.FantaSquadra, TFantasquadra.Allenatore, Sum(TAssegnaPunti.punti) AS SommaDipunti
FROM TFantasquadra INNER JOIN (TCiclisti INNER JOIN (TAssegnaPunti INNER JOIN (TInvioFormazioni INNER JOIN TRosa ON TInvioFormazioni.Codice_ciclista=TRosa.Codice_ciclista) ON (TAssegnaPunti.Codice_ciclista = TInvioFormazioni.Codice_ciclista) ON (TCiclisti.Codice_ciclista=TAssegnaPunti.Codice_ciclista) AND (TCiclisti.Codice_ciclista = TInvioFormazioni.Codice_ciclista) and (TCiclisti.Codice_ciclista=TRosa.Codice_ciclista) ON TFantasquadra.ID_squadra=TRosa.FantaSquadra
GROUP BY TCiclisti.Nome_ciclista, TRosa.FantaSquadra, TFantasquadra.Allenatore
ORDER BY Sum(TAssegnaPunti.punti) DESC;
il mio editor segnala la mancanza di due parentesi chiuse, che indico
sotto tra due asterischi(nella query originale sono infatti pareggiate
le parentesi):


SELECT TCiclisti.Nome_ciclista, TRosa.FantaSquadra,
TFantasquadra.Allenatore, Sum(TAssegnaPunti.punti) AS SommaDipunti
FROM TFantasquadra INNER JOIN
(TCiclisti INNER JOIN
(TAssegnaPunti INNER JOIN
(TInvioFormazioni INNER JOIN
TRosa
ON
TInvioFormazioni.Codice_ciclista=TRosa.Codice_ciclista)
ON (TAssegnaPunti.Codice_ciclista =
TInvioFormazioni.Codice_ciclista)
ON
(TCiclisti.Codice_ciclista=TAssegnaPunti.Codice_ciclista) AND
(TCiclisti.Codice_ciclista = TInvioFormazioni.Codice_ciclista)
and
(TCiclisti.Codice_ciclista=TRosa.Codice_ciclista)
*))*
ON TFantasquadra.ID_squadra=TRosa.FantaSquadra
GROUP BY TCiclisti.Nome_ciclista, TRosa.FantaSquadra,
TFantasquadra.Allenatore
ORDER BY Sum(TAssegnaPunti.punti) DESC;

Continua a leggere su narkive:
Loading...