Mi rivolgo principalmente a Roberto, visto che poco tempo fa mi ha aiutato
in modo eccelso a risolvere il mio piccolo problema !!
Roberto ti scrivo qui (poichè mi hai detto che in email non vuoi scocciature
per quanto riguarda Access).
Dunque.. non so se ti ricordi, quasi un mesetto fa mi avevi aiutato a
risolvere un problema all'interno del mio database er la gestione di un
piccolo campionato calcistico.
Ora sperando nella tua pazienza avrei un altro piccolo problemino..
Provo ad illustrartelo.. sperando in un tuo aiuto..
Ti rifaccio una panoramica sul database, (so che hai una buona memoria. ma
sicuramente non ti ricorderai di questo ;)))
All'interno del mio database ho:
Tabella: SQUADRE formata da:
Id_Squadra
Squadra
PuntiPen
Tabella PARTITE formata da:
Id_Partita contatore
Giornata n (testo)
And_Rit (testo)
data (data)
Squadra1 (numerico)
Squadra2 (numerico)
Risultato1 (numerico)
Risultato2 (numerico
Segno1 (testo)
Segno2 (testo)
Si/No (si/no)
In questa tabella i campi segno sono campi che vendono modifivati quando
inserisco all'interno di una tabella i risultati delle partite.. qui in
seguito alla vittoria al pareggio alla perdita di ogni squadra, viene legato
un valore (V= vinto P= perso N= paregiato), questo valore presumo non ci sia
necessario per calcolare quello che ora servirebbe a me.
Da queste tabelle vorrei ottenere la classifica delle squadre, io ho già
provato.. (sicuramente in un modo un po rozzo poichè ho utilizzato un certo
numero di query che mi effettuano singlarmente il conteggio di tutte le
colonne Risultato1 e Risultato2 generando poi dalla somma di queste due
tabelle Somma delle partite Pareggiate Perse Dei Goal Fatti e dei Goal
Subiti.
Ovviamente 8come ho detto) ho fatto un lavoro un po' rozzo.. infatti tutto
funzioan regolarmente.. ma se all'interno del campionato ho solo la prima
giornata la mia classifica salta !! Ossia non mi fa vedere nulla !!
Ora, riosservando il codice di una query che mi hai passato la volta scorsa
per calcolare i goal fatti e quelli subiti (utilizzando la query unione
presumo) ho provato ad ottenere la classifica, ma senza risultato ;(((
Mi chiedo quidni se puoi gentilmente aiutarmi ad ottenere da queste due
tabelle la classifica
Qui di seguito ti posto nuovamente la query che mi avevi mandato... per caso
è possibile far girare tutto qui dentro ?
_______
> Allora stanti così le cose creati Query1 in modo che abbia il seguente
> codice SQL:
>
> SELECT IdPartita, 1 AS CFC, Squadra1 AS Squadra, Risultato1 AS FattiCasa,
0
> AS FattiFuoriCasa, Risultato2 AS SubitiCasa, 0 AS SubitiFuoriCasa
> FROM PARTITE
> WHERE SiNo = True
> UNION SELECT IdPartita, 2 AS CFC, Squadra2 AS Squadra, 0 AS FattiCasa,
> Risultato2 AS FattiFuoriCasa, 0 AS SubitiCasa, Risultato1 AS
SubitiFuoriCasa
> FROM PARTITE
> WHERE SiNo = True;
>
> Quindi otterrai il risultato che cerchi da una query basata su Query1 che
> abbia il seguente codice SQL:
>
> SELECT Squadra, [GoalFattiInCasa]+[GoalFattiFuori] AS SommaGoalFatti,
> Sum(FattiCasa) AS GoalFattiInCasa, Sum(FattiFuoriCasa) AS GoalFattiFuori,
> [GoalFattiInCasa]-[GoalFattiFuori] AS FattiDifferenzaReti,
> [SubitiCasa]+[SubitiFuori] AS SommaSubiti, Sum(SubitiCasa) AS SubitiCasa,
> Sum(SubitiFuoriCasa) AS SubitiFuori, [SubitiCasa]-[SubitiFuori] AS
> SubitiDifferenzaReti, [SommaGoalFatti]-[SommaSubiti] AS DifferenzaReti
> FROM Query1
> GROUP BY Squadra;
>
> Se la tabella che contiene i nomi delle squadre si chiama SQUADRE ed ha
una
> struttura simile a questa:
>
> IdSquadra Contatore e chiave primaria
> NomeSquadra Testo
>
> Se vuoi che nella query precedente ti compaia il nome delle squadre al
posto
> del loro codice, cambia il codice SQL di tale query nel modo seguente:
>
> SELECT SQUADRE.NomeSquadra, [GoalFattiInCasa]+[GoalFattiFuori] AS
> SommaGoalFatti, Sum(Query1.FattiCasa) AS GoalFattiInCasa,
> Sum(Query1.FattiFuoriCasa) AS GoalFattiFuori,
> [GoalFattiInCasa]-[GoalFattiFuori] AS FattiDifferenzaReti,
> [SubitiCasa]+[SubitiFuori] AS SommaSubiti, Sum(Query1.SubitiCasa) AS
> SubitiCasa, Sum(Query1.SubitiFuoriCasa) AS SubitiFuori,
> [SubitiCasa]-[SubitiFuori] AS SubitiDifferenzaReti,
> [SommaGoalFatti]-[SommaSubiti] AS DifferenzaReti
> FROM Query1 INNER JOIN SQUADRE ON Query1.Squadra = SQUADRE.IdSquadra
> GROUP BY SQUADRE.NomeSquadra;
>
> --
> Roberto
_______________
So che buttata così la cosa sia un po' difficile..
In ogni caso.. (sempre se puoi aiutarmi) dimmi dove non sonon stato
chiaro... piano piano spero di poter riuscire con il tuo aiuto a risolvere
questo problema !!!!
Grazie nuovamente , attendo tue notizie !!
A1
Prova a modificare il codice SQL di Query1 in questa maniera:
SELECT IdPartita, 1 AS CFC, Squadra1 AS Squadra, IIf(Risultato1 >
Risultato2, 1,0) As VinteIC, IIf(Risultato1 = Risultato2, 1,0) As PariIC,
IIf(Risultato1 < Risultato2, 1,0) As PerseIC, 0 As VinteFC, 0 As PariFC, 0
As PreseFC, Risultato1 AS FattiCasa, 0 AS FattiFuoriCasa, Risultato2 AS
SubitiCasa, 0 AS SubitiFuoriCasa
FROM PARTITE
WHERE SiNo = True
UNION SELECT IdPartita, 2 AS CFC, Squadra2 AS Squadra, 0 as VinteIC, 0 As
PariIC, 0 As PerseIC, IIF(Risultato2 > Risultato1, 1, 0) As VinteFC,
IIF(Risultato2 = Risultato1, 1, 0) As PariFC, IIF(Risultato2 < Risultato1,
1, 0) As PerseFC, 0 AS FattiCasa, Risultato2 AS FattiFuoriCasa, 0 AS
SubitiCasa, Risultato1 AS SubitiFuoriCasa
FROM PARTITE
WHERE SiNo = True;
e il codice SQL che deve darti la classifica in questa maniera:
SELECT SQUADRE.NomeSquadra, 3*[Vinte]+[Pari] AS Punti,
[GiocateCasa]+[GiocateFuoriCasa] AS Giocate, [VinteIC]+[PariIC]+[PerseIC] AS
GiocateCasa, [VinteFC]+[PariFC]+[PerseFC] AS GiocateFuoriCasa,
[VinteIC]+[VinteFC] AS Vinte, [PariIC]+[PariFC] AS Pari, [PerseIC]+[PerseFC]
AS Perse, Sum(Query1.VinteIC) AS VinteIC, Sum(Query1.PariIC) AS PariIC,
Sum(Query1.PerseIC) AS PerseIC, Sum(Query1.VinteFC) AS VinteFC,
Sum(Query1.PariFC) AS PariFC, Sum(Query1.PreseFC) AS PerseFC,
[GoalFattiInCasa]+[GoalFattiFuori] AS SommaGoalFatti, Sum(Query1.FattiCasa)
AS GoalFattiInCasa, Sum(Query1.FattiFuoriCasa) AS GoalFattiFuori,
[GoalFattiInCasa]-[GoalFattiFuori] AS FattiDifferenzaReti,
[SubitiCasa]+[SubitiFuori] AS SommaSubiti, Sum(Query1.SubitiCasa) AS
SubitiCasa, Sum(Query1.SubitiFuoriCasa) AS SubitiFuori,
[SubitiCasa]-[SubitiFuori] AS SubitiDifferenzaReti,
[SommaGoalFatti]-[SommaSubiti] AS DifferenzaReti
FROM Query1 INNER JOIN SQUADRE ON Query1.Squadra = SQUADRE.IdSquadra
GROUP BY SQUADRE.NomeSquadra
ORDER BY (3*(Sum(Query1.VinteIC) +Sum(Query1.VinteFC)) +( Sum(Query1.PariIC)
+Sum(Query1.PariFC))) DESC , Sum(Query1.VinteIC)+Sum(Query1.VinteFC) DESC;
Facci sapere se funziona: io non l'ho potuta provare in quanto non avevo i
dati per farlo.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
ti faccio sapere... durante i prox day !;)
Grazieee
Mr. Roberto.. Buongiorno !!
Ho provato la soluzione che mi hai postato..e pare funzionare.. solo che
sussiste un piccolo problema di ordinamento..
mi spiego meglio
Per ottenere la classifica perfetta dovrei ordinare i risultati seguendo
questa logica:
Prima ordino per
PUNTI in ordine decrescente
se i punti sono uguali proseguo l'ordinamento con
DIFFERENZARETI in ordine decrescente
se anche differenza reti è uguale continuo con
GOAL FATTI in ordine decrescente
se pure questi sono uguali rimedio con
l'ordinamento in ordine alfabetico..
So che ti sto stressando.. ma puoi cortesemente suggerirmi come modificare
il codice che mi hai passato per ottenere questo risultato ?
Grazie per l'enorme pazienza !!
Attendo con ansia una tua risposta !
Saluti A1
Prova a modificare il codice SQL della query cosě:
SELECT SQUADRE.NomeSquadra, 3*[Vinte]+[Pari] AS Punti,
[GiocateCasa]+[GiocateFuoriCasa] AS Giocate, [VinteIC]+[PariIC]+[PerseIC] AS
GiocateCasa, [VinteFC]+[PariFC]+[PerseFC] AS GiocateFuoriCasa,
[VinteIC]+[VinteFC] AS Vinte, [PariIC]+[PariFC] AS Pari, [PerseIC]+[PerseFC]
AS Perse, Sum(Query1.VinteIC) AS VinteIC, Sum(Query1.PariIC) AS PariIC,
Sum(Query1.PerseIC) AS PerseIC, Sum(Query1.VinteFC) AS VinteFC,
Sum(Query1.PariFC) AS PariFC, Sum(Query1.PreseFC) AS PerseFC,
[GoalFattiInCasa]+[GoalFattiFuori] AS SommaGoalFatti, Sum(Query1.FattiCasa)
AS GoalFattiInCasa, Sum(Query1.FattiFuoriCasa) AS GoalFattiFuori,
[GoalFattiInCasa]-[GoalFattiFuori] AS FattiDifferenzaReti,
[SubitiCasa]+[SubitiFuori] AS SommaSubiti, Sum(Query1.SubitiCasa) AS
SubitiCasa, Sum(Query1.SubitiFuoriCasa) AS SubitiFuori,
[SubitiCasa]-[SubitiFuori] AS SubitiDifferenzaReti,
[SommaGoalFatti]-[SommaSubiti] AS DifferenzaReti,
[SommaGoalFatti]-[SommaSubiti] AS Espr1
FROM Query1 INNER JOIN SQUADRE ON Query1.Squadra = SQUADRE.IdSquadra
GROUP BY SQUADRE.NomeSquadra
ORDER BY
(3*(Sum(Query1.VinteIC)+Sum(Query1.VinteFC))+(Sum(Query1.PariIC)+Sum(Query1.
PariFC))) DESC ,
Sum(([FattiCasa]+[FattiFuoriCasa]))+Sum([SubitiCasa]+[SubitiFuoriCasa]) DESC
, Sum(([FattiCasa]+[FattiFuoriCasa])) DESC;
Dovrebbe funzionare.
>
> Saluti A1
RiSalve..Roberto (stai diventando il mio mito !!!)
dunque tutto sembra funzionare correttamente.. solo che se provo a
controllare bene analizzando la classifica ora ottengo la classifica
correttamente impostata per quanto riguarda il PUNTEGGIO, però quando capita
che la squadra ha lo stesso punteggio e passa all'ordinamento per differenza
reti.. succede qualcosa che non quadra..
Per spiegarti meglio il problema ti faccio un esempio:
Milan punti 5 differenza reti 30
Inter punti 5 differenza reti -30
Juve punti 5 differenza reti 1
Lazio punti 5 differenza reti -1
come vedi l'ordinamento non è perfetto in quanto per essere corretto avrebbe
divuto essere:
Milan punti 5 differenza reti 30
Juve punti 5 differenza reti 1
Lazio punti 5 differenza reti -1
Inter punti 5 differenza reti -30
Giusto? In questo caso è possibile risolvere questo inconveniente ?
Mi auguro sinceramente di si..
Inoltre ho notato che in un altra parte dela classifica si verifica (sempre
in relazione a quanto si diceva prima):
Roma punti 0 differenza reti -12
Torino punti 0 differenza reti -3
Genova punti 0 differenza reti -3
Invece dovrebbe essere (se in ordine decrescente)
Torino punti 0 differenza reti -3
Genova punti 0 differenza reti -3
Roma punti 0 differenza reti -12
Giusto?
Roberto se hai tempo e ancora un po' di pazienza attendo una tua risposta..
Grazie come al solito in anticipo per l'aiuto che mi dai !!
A1
Sono lusingato di stare diventando per te un "mito", però quando do una
soluzione a chi la chiede, il mio obiettivo primario non è quello di fornire
una soluzione "chiavi in mano", ma è quello che la soluzione venga compresa
così che chi la applica impari qualcosa; questo però non sta succedendo con
te, che mi sembra non hai molta voglia di capire come è costruita la query,
quindi ricorri ancora a me per modificare semplicemente i suoi criteri di
ordinamento.
Per postare la query, per comodità, uso il suo codice SQL, che però capisco
che possa risultare piuttosto ermetico per chi non ha creato la query e/o
per chi ha poca confidenza con il linguaggio SQL; ti consiglio di
visualizzare la griglia di struttura della query: tutto dovrebbe esserti più
familiare. Se così non fosse, significa che non hai studiato Access neppure
nei suoi fondamentali e questo non è compatibile con il fatto che tu voglia
imparare a programmare Access.
O forse mi sbaglio e a te non importa nulla di imparare a programmare Access
e sei solo alla ricerca di qualcuno che faccia al posto tuo parte del tuo
database?
Sperando che sia l'ultima mia risposta riguardo al problema (nel senso che
inizierai a studiare le queries e le eventuali successive modifiche le
effettuerai da solo), mi sembra praticamente impossibile che l'ordinamento
sulla differenza reti avvenga sul valore assoluto e non relativo del campo,
ma non ho i dati per poter provare il contrario, quindi assumo per buona la
tua segnalazione; ad ogni buon conto prova a modificare la query in questo
modo:
SELECT SQUADRE.NomeSquadra, 3*[Vinte]+[Pari] AS Punti,
[GiocateCasa]+[GiocateFuoriCasa] AS Giocate, [VinteIC]+[PariIC]+[PerseIC] AS
GiocateCasa, [VinteFC]+[PariFC]+[PerseFC] AS GiocateFuoriCasa,
[VinteIC]+[VinteFC] AS Vinte, [PariIC]+[PariFC] AS Pari, [PerseIC]+[PerseFC]
AS Perse, Sum(Query1.VinteIC) AS VinteIC, Sum(Query1.PariIC) AS PariIC,
Sum(Query1.PerseIC) AS PerseIC, Sum(Query1.VinteFC) AS VinteFC,
Sum(Query1.PariFC) AS PariFC, Sum(Query1.PreseFC) AS PerseFC,
[GoalFattiInCasa]+[GoalFattiFuori] AS SommaGoalFatti, Sum(Query1.FattiCasa)
AS GoalFattiInCasa, Sum(Query1.FattiFuoriCasa) AS GoalFattiFuori,
[GoalFattiInCasa]-[GoalFattiFuori] AS FattiDifferenzaReti,
[SubitiCasa]+[SubitiFuori] AS SommaSubiti, Sum(Query1.SubitiCasa) AS
SubitiCasa, Sum(Query1.SubitiFuoriCasa) AS SubitiFuori,
[SubitiCasa]-[SubitiFuori] AS SubitiDifferenzaReti,
[SommaGoalFatti]-[SommaSubiti] AS DifferenzaReti
FROM Query1 INNER JOIN SQUADRE ON Query1.Squadra = SQUADRE.IdSquadra
GROUP BY SQUADRE.NomeSquadra
ORDER BY
(3*(Sum(Query1.VinteIC)+Sum(Query1.VinteFC))+(Sum(Query1.PariIC)+Sum(Query1.
PariFC))) DESC ,
900-(Sum(([FattiCasa]+[FattiFuoriCasa]))+Sum([SubitiCasa]+[SubitiFuoriCasa])
), Sum(([FattiCasa]+[FattiFuoriCasa])) DESC;
>
> Grazie come al solito in anticipo per l'aiuto che mi dai !!
>
> A1
--
Ciao Roberto,
mmm Access mi piace e cerco di impararlo..
ma sicuramente qualcosa mi risulta difficile..
Ho chiesto il tuo consiglio solamente dopo aver provato e riprovato a far
funzionare la query, modificando i parametri proprio dalla visualizzazione
struttura (proprio perchè da sql non ci capivo molto..). Solo che dopo
averci ragionato sopra ho ho desistito e ho postato il messaggio
precedente.. proprio perchè quell'errore non riesco a risolverlo..
Infatti anche di seguito al tuo ultimo post la mia classifica rimane come ti
ho detto sballata.. proprio perchè non mi riconosce l'ordine corretto..
Come ti ho detto ieri vedo l'ordine in questo modo
30
-30
1
-1
e su un altro punteggio..
-12
-3
-3
Il che vuol dire che l'ordinamento in ordine decrescente non mi riconosce il
segno negativo, ma considera solo il numero che abbia sbagliato qualcosa nei
settaggi della tabella ? Eppure è tutto numerico ed in teoria essendo così
impostato dovrebbe riconosce un numero positivo da un numero negativo!!
malgrado controllando e ricontrollando la query ho notato che tutto dovrebbe
andare proprio perchè gli ordinamenti da te impostati (per quello che ho
visto io ) sono corretti.. Solo che.. NON VA! E tutto questo non è logicoo
!! Infatti la presente stringa di ordinamento è precisa:
ORDER BY
(3*(Sum(Query1.VinteIC)+Sum(Query1.VinteFC))+(Sum(Query1.PariIC)+Sum(Query1.
PariFC))) DESC ,
900-(Sum(([FattiCasa]+[FattiFuoriCasa]))+Sum([SubitiCasa]+[SubitiFuoriCasa])
) , Sum(([FattiCasa]+[FattiFuoriCasa])) DESC;
Ora non voglio e non volevo apparire come "uno scroccone" del lavoro
altrui.. proprio perchè mi piace solitamente costruire le cose da me..
Stò apprendendo piano piano e quidni a volte vado a scervellarmi su cose che
poi si si rivelano non
corrette.. proprio perchè non ho ancora un buon metodo di impostazione dei
db..
Le query da te postate mi sono state parecchio utili ho appreso per lo meno
la funzione di unione.. e di impostazione (più ottimizzata) del database..
Quindi mi scuso se ho fatto la figura di chi voleva approfittare.. PARDON
non era mia intenzione.
Il fatto è che è un sacco che sono dietro a questo Db.. che, a quanto pare
per voi.. è un qualcosa di facile .. mentre per me .. sembra
incompletabile...
Piano piano spero davvero di riuscir a metter giù un db correttamente
impostato e funzionale.. ovviamente anche attraverso sitocomune che come
informazioni si sta rivelando davvero utile..
> Sperando che sia l'ultima mia risposta riguardo al problema (nel senso che
> inizierai a studiare le queries e le eventuali successive modifiche le
> effettuerai da solo), mi sembra praticamente impossibile che l'ordinamento
> sulla differenza reti avvenga sul valore assoluto e non relativo del
> campo,
Cerco di apprendere.. e per quel che posso .. cerco davvero di fare da
solo.. ma qui proprio non riesco a capire dove sia il problema ! Non è
mancanza di impegno.. è proprio "Ignoranza" nel comprendere il motivo di
tale problema ! ;(
Che il mio access sia andato in palla ?
Saluti
A1
Non so se è possibile.. ma ho ricostruito la Query dall'inizio.. ed ora
funzionaaaa !!
Possibile che si era impallato qualcosa !?!?!!?
MITICOOOOOOOOOOOO !!!
Comq. Prox Day mi dovrò comprar il manuale.. prima o poi devo mettermi giù
seriamente !!!
Grazie davvero per il supporto !!!
Sei stato troppo gentile e paziente !
Prendi il mio ragionamento come uno sfogo: d'altra parte quelle cose le
penso e mi sembra gisto che le dica.
Viste le cose dal mio punto di vista a volte ho la sensazione che alcuni
frequentatori chiedano la soluzione chiavi in mano, senza avere alcuna
voglia di studuiare e conoscere Access.
Altri invece ho la sensazione che pretendano di fare il passo più lungo
della loro gamba: vogliono realizzare soluzioni abbastanza complesse ae/o
avanzate, anticipando i tempi, non aspettando cioè di aver acquisito tutte
le cognizioni su Access che sono necessarie: ciò nonostante pretendo una
soluzione funzionante chiavi in mano.
Come ho avuto modo di scrivere altre volte l'informatica è un piatto gustoso
da assaporare seduti e con calma e non è un panino da azzannare in piedi di
corsa al fastfood; questa è una verità da cui chi vuole impararee Access non
può disconoscere.
Tanto per concludere, penso che il NG serva anche a fornire soluzioni
particolari a chi le richieda, ma poi chi le riceve deve essere in grado di
capirle per personalizzarle ed eventualmente migliorarle; non credo che sia
opportuno che si limiti invece ad un brutale copia/incolla e poi se funziona
OK, in caso contrario torna alla carica.
>
> Saluti
Con una query non mi era mai capitato, ma con una maschera sulla quale
facevo modifiche su modifiche mi è capitato più volte che Access perdesse la
bussola ed ho risolto solo ricreandola ex novo.
>
> MITICOOOOOOOOOOOO !!!
>
> Comq. Prox Day mi dovrò comprar il manuale.. prima o poi devo mettermi giù
> seriamente !!!
Te lo consiglio spassionatamente: penso che se i neofiti tutto il tempo
impiegato a sbattere la testa contro il monitor a NON risolvere i problemi
lo dedicassero allo studio risolverebbero sicuramente in breve tutti i loro
problemi.
>
> Grazie davvero per il supporto !!!
> Sei stato troppo gentile e paziente !
Non ti preoccupare; come dice Shakespeare: "La pazienza è la virtù dei
forti". ;-)