Un problema di query in Access

lunedì 30 agosto 2010 - 12.55
Tag Elenco Tags  Access (.mdb)

purplepurple Profilo | Newbie

Buongiorno a tutti,
avrei un problema su come chiedere ad access (2003) l'estrapolazione di alcuni dati da due diverse tabelle (per la gestione di un registro voti)e che cercherò di spiegare qui di seguito:
ho una tabella con i seguenti campi: IdNome;Nome;/....altri dati anagrafici; e una tabella che contiene le materie e i relativi voti con i seguenti campi: IdNome;materia; voto1;voto2;voto3;voto4;media.
Quello che vorrei cercare di ottenere è una tabella riassuntiva che mi dia - per ogni nome selezionato - la corrispondente media per ogni materia e la media generale, relativa cioè alla somma delle medie per materia diviso il numero di materie.
Un'altro degli ostacoli che ho trovato riguarda appunto il numero delle materie e le relative medie e cioè (per esempio):
MediaMateria1= 8; MediaMateria2= 7; MediaMateria3= 0 (che sta a significare "non ancora valutato"). In questo caso la media generale non può essere ottenuta dividendo la somma dei voti per 3 perchè, essendoci una materia non ancora verificata, ne risulterebbe una media falsata; quindi bisognerebbe dire ad access che deve dividere (in questo caso) solo per 2.
Questo è tutto. Spero di essermi fatto capire e, nella speranza che Qualcuno di voi possa venirmi in aiuto, vi auguro una buona giornata e un buon fine agosto.
Giampaolo
Ps: un piccolo esempio pratico sarebbe di grande conforto alla mia ignoranza.

alexmed Profilo | Guru

Ciao
Mi approccio in maniera differente con 3 Tabelle:
1. Studenti
IDStudente - Nome - Cognome
2. Materie
IDMateria - Materia
3. Voti
IDVoto - IDStudente - IDMateria - Voto - Data

e con questa query:

SELECT Studenti.IDStudente, Studenti.Nome, Materie.Materia, Sum(Voti.Voto) AS SommaDeiVoti, Count(Voti.Voto) AS NumeroDiVoti, Sum(Voti.Voto)/Count(Voti.Voto) AS Media
FROM Studenti INNER JOIN (Materie INNER JOIN Voti ON Materie.IDMateria = Voti.IDMateria) ON Studenti.IDStudente = Voti.IDStudente
GROUP BY Studenti.IDStudente, Studenti.Nome, Materie.Materia;

Risolvo tutto.

Se poi voglio filtrare per Studente aggiungo la clausola WHERE IDStudente = ?

Ti allego progettino.

Ciao

alexmed

purplepurple Profilo | Newbie

Grazie tante per la cortese e rapidissima risposta; ho visto l'esempio che hai allegato e direi che, ignoranza permettendo, dovrei riuscire ad adattare alle mie esigenze. Devo vedere adesso come conciliare il tutto con le maschere che ho già fatto e che devono rispettare un layout obbligato.
Ciao, e ancora grazie.

PS: lo stemma dei 4 mori sta ad indicare che sei sardo? Io si.

doppio PS: dimenticavo, hai anche una soluzione per la seconda parte del quesito, quella che riguarda la media generale? (somma delle medie di tutte le materie diviso per il numero delle materie - escludendo ovviamente quelle uguali a 0)
Ri-grazie

alexmed Profilo | Guru

La query dovrebbe essere così:

SELECT Studenti.IDStudente, Studenti.Nome, Sum(Voti.Voto) AS SommaTotaleDeiVoti, Count(Materie.Materia) AS NumeroTotaleDiVoti, Sum(Voti.Voto)/Count(Materie.Materia) AS Media
FROM Studenti RIGHT JOIN (Materie INNER JOIN Voti ON Materie.IDMateria = Voti.IDMateria) ON Studenti.IDStudente = Voti.IDStudente
GROUP BY Studenti.IDStudente, Studenti.Nome;

Prova e fammi sapere

Ciao

alexmed

PS.
Eia ... sono di origini campidanesi.

purplepurple Profilo | Newbie

Funziona! Grazie tante per la disponibilità.
Giampaolo.

PS: Io sono di Iglesias. Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5