Contare record con valore massimo e minimo

di il
15 risposte

Contare record con valore massimo e minimo

Salve, ho un problema con access. Vorrei che in un report mi comparisse il conteggio di quante volte un valore sia stato massimo nel campo Valutazioni della tabella Registrazioni. In questo campo io inserisco valori da 1 a 5 e mi servirebbe sapere quante volte si è avuto il valore massimo (che non è detto sia 5) e quante il valore minimo. Sono alle prime armi con access e vi pregherei di darmi una risposta semplice. Ho cercato nel forum ma non ho trovato nulla in merito... grazie in anticipo

15 Risposte

  • Re: Contare record con valore massimo e minimo

    ... Ero anche interessato all'argomento "Maschera come programma indipendente", ma è stato bloccato...
  • Re: Contare record con valore massimo e minimo

    Si può ragionare così:
    1) Crea una query di selezione dove importi la tabella Registrazioni e trascina 2 volte nella griglia il campo Valutazioni.
    2) Clicca in alto sul tasto Totali (ha una icona a forma di ?)
    3) Nella griglia, in corrispondenza di Formula, scrivi nella 1° colonna Min, nella 2° colonna Max.
    4) Salva con nome la query "MinMaxDiValutazione"
    5) Crea una nuova query di selezione, importando Registrazioni e MinMaxDiValutazione.
    6) Disegna una linea di join dal campo Valutazione verso MinDiValutazione.
    7) Salva la query con nome "ValutazioniMinime"
    Crea una nuova query di selezione, importando Registrazioni e MinMaxDiValutazione.
    9) Disegna una linea di join dal campo Valutazione verso MaxDiValutazione.
    10) Salva la query con nome "ValutazioniMassime"
    11) Apri il report in visualizzazione struttura
    12) Crea due caselle di testo indipendenti e sistemale in una zona che non sia il Corpo (suggerisco Intestazione report).
    13) Nella prima casella, scrivici dentro:
    ="Il minimo è " & DMin("[Valutazione]";"Registrazioni";"") & " e appare " & DCount("*";"ValutazioniMinime";"") & " volte"
    14) Nella seconda casella, scrivici dentro:
    ="Il massimo è " & DMax("[Valutazione]";"Registrazioni";"") & " e appare " & DCount("*";"ValutazioniMassime";"") & " volte"
    15) Salva il report

    Io ho fatto un ragionamento passo passo (testato e funziona), immagino si possano creare due sintassi più complesse per le due caselle di testo, senza scomodare la creazione di 3 query.
    N.B.: Ho preferito nominare il campo Valutazione (anzichè Valutazioni) per motivi di coerente standardizzazione di denominazione campi (generalmente si preferisce usare il singolare).
  • Re: Contare record con valore massimo e minimo

    Con una Query Grouped puoi ricavare in modo semplice il Min e quante volte esce
    
    SELECT Count(Tx.CampoValore) AS Numero, Tx.CampoValore
    FROM (SELECT Top 1 CampoValore FROM T1 Order By CampoValore)  AS Tx
    GROUP BY Tx.CampoValore;
    Ovviamente il Massimo è uguale basta cambiare l'Ordinamento
    SELECT Count(Tx.CampoValore) AS Numero, Tx.CampoValore
    FROM (SELECT Top 1 CampoValore FROM T1 Order By CampoValore DESC)  AS Tx
    GROUP BY Tx.CampoValore;
    O se preferisci puoi fare una Query UNICA
    
    SELECT Count(Tx.CampoValore) AS Numero, Tx.CampoValore
    FROM (SELECT Top 1 CampoValore FROM T1 Order By CampoValore)  AS Tx
    GROUP BY Tx.CampoValore UNION SELECT Count(Tx.CampoValore) AS Numero, Tx.CampoValore
    FROM (SELECT Top 1 CampoValore FROM T1 Order By CampoValoreDESC)  AS Tx
    GROUP BY Tx.CampoValore;
    Salva questo predicato in una Query ipotizziamo [QMinMax]
    A questo punto recuperi i 4 valori:
    1) NUM MIN e VALORE di MIN
    2) NUM MAX e VALORE di MAX

    Per recuperarli siccome sai che sono in Ordine...
    
    Dim rs As DAO.Recordset
    
    Set rs = DbEngine(0)(0).OpenRecordset("QMinMax")
    NumMIN=rs.Fields(0).Value
    MIN=rs.Fields(1).Value
    rs.Movenext
    NumMAX=rs.Fields(0).Value
    MAX=rs.Fields(1).Value
    rs.close
    set rs=nothing
  • Re: Contare record con valore massimo e minimo

    Approfitto di questo post perchè da molto tempo non riesco a capire come sfruttare al meglio il 3° campo della DCount. Nelle varie guide in linea dice che funziona come una WHERE, quindi mi aspetto abbia una funzione di filtro.
    Vorrei sapere se, anzichè giocare con le query che ho proposto, si poteva impostare così
    ="Il minimo è " & DMin("[Valutazione]";"Registrazioni";"") & " e appare " & DCount("*";"Registrazioni";"xxx") & " volte"
    dove al posto di "xxx" vorrei mettere una sintassi tipo
    DMin("[Valutazione]";"Registrazioni";"")
    ho provato in tanti modi, ma mi dà errore, oppure Access si autocorregge ignorando la sintassi proposta da me.
    È impossibile sfruttare il 3° campo DCount per questo scopo?
    C'è qualche errore di sintassi?
  • Re: Contare record con valore massimo e minimo

    Non ho letto tutto, quindi mi limito a farti un'esempio di DCOUNT(...) e ricordarti che tutte le funzioni di aggregazione supportano il 3° Parametro.
    Tabella [T1]
    
    ID		CITTA		NOME
    1		MANTOVA		ALESSANDRO
    2		BRESCIA		PIERO
    3		MANTOVA		CARLO
    4		MILANO		GIORGIO
    Contiamo quanti sono di Mantova...?
    
    DCOUNT("*","T1","[CITTA]='MANTOVA'")
    Ciao
  • Re: Contare record con valore massimo e minimo

    Hai fatto un esempio classico, contemplato dagli esempi guida in linea, dove commettere errore di sintassi è raro. Io ho scritto questa sintassi
    ="Il minimo è " & DMin("[Valutazione]";"Registrazioni";"") & " e appare " & DCount("*";"Registrazioni";"[Valutazione]='DMin("[Valutazione]";"Registrazioni";"")'") & " volte"
    e Access non mi dà nemmeno la possibilità di testarlo, inviando immediatamente un messaggio "Errore di sintassi nell'espressione - È possibile che sia stato immesso un operando senza un operatore". Credo di averla rispettata, coerentemente al problema proposto da robertocolucci. Dov'è il problema?
  • Re: Contare record con valore massimo e minimo

        ="Il minimo è " & DMin("[Valutazione]";"Registrazioni";"") & " e appare " & DCount("*";"Registrazioni";"[Valutazione]='DMin("[Valutazione]";"Registrazioni";"")'") & " volte"
    apice non chiuso dopo "[Valutazione]='DMin
  • Re: Contare record con valore massimo e minimo

    No mypipe, la tua sintassi è identica alla mia ultima, io gli apici li ho messi entrambi. Il problema rimane.
  • Re: Contare record con valore massimo e minimo

    OsvaldoLaviosa ha scritto:


    Hai fatto un esempio classico, contemplato dagli esempi guida in linea, dove commettere errore di sintassi è raro. Io ho scritto questa sintassi
    ="Il minimo è " & DMin("[Valutazione]";"Registrazioni";"") & " e appare " & DCount("*";"Registrazioni";"[Valutazione]='DMin("[Valutazione]";"Registrazioni";"")'") & " volte"
    e Access non mi dà nemmeno la possibilità di testarlo, inviando immediatamente un messaggio "Errore di sintassi nell'espressione - È possibile che sia stato immesso un operando senza un operatore". Credo di averla rispettata, coerentemente al problema proposto da robertocolucci. Dov'è il problema?
    Mi astengo da un giudizio tecnico...
    DCount("*";"Registrazioni";"[Valutazione]='" & DMin("[Valutazione]";"Registrazioni") & "'")
    Non l'ho provato, ma la sintassi ora è corretta.
  • Re: Contare record con valore massimo e minimo

    No Alex, nemmeno questa va bene.
    Il messaggio di errore di sintassi non compare più, ma, quando vado ad eseguire il report, appare #Errore dentro la casella di testo.
    Sinceramente non capisco l'utilità di mettere & prima e dopo l'espressione DMin.
  • Re: Contare record con valore massimo e minimo

    Osvaldo... [Valutazioni] è un campo di tipo TESTO o no...?

    Se è di tipo Numerico la sintassi non prevede l'APICETTO, se è ti tipo TESTO è una cavolata usare DMIN... motivo per il quale mi ero riservato commenti tecnici.
  • Re: Contare record con valore massimo e minimo

    OK Alex, [Valutazione] è Numerico. Ho tolto gli apicetti (non lo sapevo) e ho scritto come dici tu: Funziona.
    Continuo a non capire l'utilizzo di & prima e dopo. Potresti spiegarlo? Io conosco & solo come carattere di concatenazione.
    Intanto, qui sotto, descrivo la mia soluzione preferibile.

    1) Apri il report in visualizzazione struttura
    2) Crea due caselle di testo indipendenti e sistemale in una zona che non sia il Corpo (suggerisco Intestazione report).
    3) Nella prima casella, scrivici dentro:
    ="Il minimo è " & DMin("[Valutazione]";"Registrazioni";"") & " e appare " & DCount("*";"Registrazioni";"[Valutazione]=" & DMin("[Valutazione]";"Registrazioni";"") & "") & " volte"
    4) Nella seconda casella, scrivici dentro:
    ="Il massimo è " & DMax("[Valutazione]";"Registrazioni";"") & " e appare " & DCount("*";"Registrazioni";"[Valutazione]=" & DMax("[Valutazione]";"Registrazioni";"") & "") & " volte"
  • Re: Contare record con valore massimo e minimo

    Il Carattere [&] fa esattamente quello che hai detto... ovvero concatena la stringa con il NUMERO restituito dalla Funzione DMIN.
    Se inglobi la Funzione DMIN in una stringa delimitata da APICI DOPPI non è interpretabile come Funzione...!
    Esempio
    
    Dim strEs As String
    strES="DMIN(....)"
    MsgBox strES
    Se verifichi cosa contiene la stringa [strES] vedrai che la funzione o espressione non viene RISOLTA vale a dire che non viene eseguita perchè per il valutatore di ESPRESSIONI essendo compresa tra i DOPPI APICI non lo deve essere...!

    Per capire bene queste cose dovresti fare DEBUG delle funzioni da VBA, e finchè non farai quel passettino avrai sempre un limite insormontabile.
  • Re: Contare record con valore massimo e minimo

    Ho capito il tuo ragionamento, ma io avevo messo gli & prima di DCount e fra ...) & " volte", pensavo fossero questi gli & di concatenazione giusti per la realizzazione della frase finale.
    Sempre sulla tua linea di discussione, questa Access non l'accetta
    ="Il minimo è " & DMin("[Valutazione]";"Registrazioni";"") & " e appare " & DCount("*";"Registrazioni";"[Valutazione]=DMin("[Valutazione]";"Registrazioni";"")") & " volte"
    non ci sono apici prima e dopo la funzione DMin. Quelli che si vedono prima di "[Valutazione]=...ecc...") sono semplicemente gli apici obbligatori (io ce li metto sempre anche quando devo scrivere "") per descrivere il terzo campo di una funzione che inizia con D. Perchè non funziona?
Devi accedere o registrarti per scrivere nel forum
15 risposte