Query per contare record con distinct e count

di il
57 risposte

Query per contare record con distinct e count

Ciao, ho aperto altri topic per sviluppare questo db, devo dire che sono ormai verso il traguardo della soluzione delle problematiche
Ne rimane una che sarebbe utilissima per diminuire il numero di query da creare
Ho questo db che mi deve generare un report di numeri da due tabelle anagrafica e data trattamenti
Ci sono due condizioni di ricerca di base
1 periodo temporale, la ricerca avviene per trimestre
2 suddivisione per sesso

Di qui in poi ci sono tanti parametri da aggiungere
fascie di eta (circa 5)
titolo di studio (5 valori)
occupazione(6 valori)
eta prima assunzione (5 valori)
sostanza di assunzione(4 valori
2 sostanza di assunzione( 4 valori)
e qualcos altro
Mi servono i n umeri per ognuna di queste occorrenze calcolati su base trimestrale
Per farloprepareò tante query, una per ogni condizione, partendo da quella base che ha le date inserite come variabili attraverso una maschera
PEr poter contare i record delle query fin ora sono arrivate a usare 2 query
questa mi seleziona i record univoci
SELECT DISTINCT date_trattamenti.ID
FROM date_trattamenti
GROUP BY date_trattamenti.ID, date_trattamenti.dal, date_trattamenti.al
HAVING (((date_trattamenti.dal) Between [Maschere]![Ricerche]![datada] And [Maschere]![Ricerche]![dataa])) OR (((date_trattamenti.al) Between [Maschere]![Ricerche]![datada] And [Maschere]![Ricerche]![dataa]));

questa li conta
SELECT Count(dateTQ2.ID) AS ConteggioDiID
FROM dateTQ2;
dove dateTQ2 è la query di prima

Cosi facedno si raddoppiano il numero gia molto alto di query
Se potessi almeno mettere tutto questo codice in un unica query sarebbe un grande lavoro
E' possibile?
Grazie

57 Risposte

  • Re: Query per contare record con distinct e count

    Premesso che cercare di ridurre il numero di query deve partire dal tipo di correlazioni disponibili fra le query stesse.
    Stabilito l'insieme (di query) necessario per determinare uno specifico calcolo, è da considerare che la query risultante procede, a ritroso, ad elaborare quelle di provenienza.
    In tale ambito si possono impiegare le subquery:
    https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/sql-subqueries-microsoft-access-sql
    http://allenbrowne.com/subquery-01.htm
    http://azlihassan.com/apps/articles/microsoft-access/queries/running-sum-total-count-average-in-a-query-using-a-correlated-subquery
    http://www.databasedev.co.uk/sql-subqueries.htm
    https://dba.stackexchange.com/questions/76816/alternative-to-sub-query-in-ms-access

    In ogni caso è da esaminare anche quale sia l'oggetto finale che si vuole ottenere e, valutare, se questo possa essere ricondotto agli elementi di base che lo compongono.
    Ad esempio dire che si vuole la ripartizione fra maschi e femmine, implica che si deve accedere ai dati anagrafici e stabilita l'appartenenza al gruppo (in base al sesso) il relativo conteggio. In tale contesto può essere superflua una query che determini il totale complessivo in quanto, avendo i due gruppi, può scaturire direttamente dalla loro somma (senza necessità di una specifica query ).
    Su ciò si innesta anche la modalità di presentazione (che poi confluirà nella sintesi finale) in quanto le soluzioni realizzative possono essere diverse.
    Ad esempio appoggiarsi agli oggetti propri di Access (quali maschere/report con sottomaschere/sottoreport per ciascun gruppo) per la visualizzazione e magari per effettuare il relativo calcolo (conteggio/sommatoria) può non essere prodotto da query, ma dalla elaborazione sull'oggetto stesso.
    Anche l'aspetto conclusivo può essere determinate per scegliere la soluzione più conveniente e ridurre il calcolo complessivo.
    Da considerare che se i dati finali sono fra loro slegati si può sempre implementare una query ove siano presenti le varie query di conteggio (con una sola occorrenza) poste senza relazioni fra loro, in modo da ottenere un unico record con tutte le totalizzazioni condotte.
    Mentre se esiste una logica che permetta di mettere insieme query/tabelle con logica comune, si può valutare se impiegare una query di unione:

    https://www.pmi.it/economia/lavoro/11813/access-query-union.html
    http://www.fmsinc.com/microsoftaccess/query/union-all/index.htm
    https://www.w3schools.com/sql/sql_union.as

    Consiglio, pertanto, di analizzare i vari elementi costitutivi (che entrano in gioco) esaminare il processo da condurre, valutare quale debba essere il risultato finale (anche nella sua forma pratica) e procedere per gradi ad implementare la sintesi conclusiva. In tal modo si valuteranno gli elementi necessari e si cercherà, al contempo, di ottimizzarli.
  • Re: Query per contare record con distinct e count

    Guarda è molto semplice
    mi servono dei numeri
    esempio
    Quante femmine di eta compresa tra 20 e 30 in trattamento nel primo trimestre?
    quante tra 30 e 40 ecc
    Stessa cosa per imaschi
    e poi iltotale, che come dici tu ottengo sommando direttamente i due precedenti

    ecco un esempio su un altro parametro, titolo di studio
    SELECT dateTQ2.ID, anagrafica.SESSO, anagrafica.[TITOLO DI STUDIO]
    FROM dateTQ2 INNER JOIN anagrafica ON dateTQ2.ID = anagrafica.Id
    WHERE (((anagrafica.SESSO) Like "femmina") AND ((anagrafica.[TITOLO DI STUDIO]) Like "Elementari"));
    
    SELECT dateTQ2.ID, anagrafica.SESSO, anagrafica.[TITOLO DI STUDIO]
    FROM dateTQ2 INNER JOIN anagrafica ON dateTQ2.ID = anagrafica.Id
    WHERE (((anagrafica.SESSO) Like "femmina") AND ((anagrafica.[TITOLO DI STUDIO]) Like "Medie"));
    
    ..e cosi via con altri possibili tioli di studio superiori, università ecc
    ripetute anche per i maschi
    In queste query TQ2 è la query che mi seleziona l'intervallo di tempo
    Pensa che pe ril titolo di studio sono 6 valori possibili, quindi 6 query con FEMMINA e 6 con MASCHI
    totale 12
    E devo ancora ottenere il conteggio dei risultati ottenuti
    Ne avro di altre con OCCUPAZIONE al posto di TITOLO di STUDIO, oppure con SOSTANZA ASSUNTA..ecc
    questo è il pattern che si ripete
    Sono molte query
    Semplici ma un laborioso lavoro di costruzione di tutte le evenienze
    Alla fine sul report dovro mettere i totali di tutte queste evenineze
    Nell ultimo trimestre
    x femmine trattate con titolo di stuio elementare
    x femmine con licenza media ecc
    stessa cosa per i maschi
    poi totali
    e poi di nuovo stessa cosa con occupazione..e altri parametri
    Il tutto ottenuto dopo aver impostato date e premuto un tasto "esegui"
    Non credo ci sia molto da elaborare
    L'unica cosa che volevo fareè calcolare il conteggio di tutte queste query nella query stessa, o in un altro modo che non mi costringa a costruire la query di conteggio sulla query di selezione,(una unica query come hai detto tu?ci provo...) per non avere centinaia di query a quel punto
  • Re: Query per contare record con distinct e count

    Provo a tradurre quello che ho capito io finora:
    1. Tu hai moltissime query, tutte relativamente semplici...o per lo meno sei riuscito a inquadrarle una per una
    2. Di queste moltissime query vuoi calcolare quanti record ha ognuna
    3. Alla fine di un certo periodo (trimestre mi pare di capire) vuoi contarle tutte e scrivere i totali da qualche parte
    Giusto?

    Se la mia analisi è corretta, io ci vedrei una tabella di "appoggio dati" (fuori da ogni contesto relazionale) dove vai a collocare tutti i
    DCount("*";"Query1)
    DCount("*","Query2)
    DCount("*";"Query3)
    ...ecc...

    Su questa tabella di appoggio ci fai poggiare sopra un report organizzato come meglio preferisci.
  • Re: Query per contare record con distinct e count

    Si giusto
    ho provato a farlo su una query e su un report, il count di piu query ottenute ma non funziona,(quello che tu dici di fare in una tabella separata) con 1 si, ma quando ne metto 2 i due valori diventano uguali, non so per quale criterio una somma delle due query diventa uguale a quella dell altra query
  • Re: Query per contare record con distinct e count

    La mia soluzione tende a tagliare la testa al toro ignorando di fare calcoli da una query dentro un'altra query. Ogni DCount è un valore che tu vai a mettere dentro una tabella che chiamerei RiepilogoTrimestrale. Questa tabella avrebbe i seguenti campi:
    IDRiepilogo (PK) (relativamente superfluo...se vuoi puoi non metterlo…)
    NomeQuery
    ConteggioQuery

    Con un po' di ingegno automatizzi una routine in VBA sfruttando DAO.Recordset di RiepilogoTrimestrale, chiami le query una per una e ci vai a mettere i relativi valori nei campi NomeQuery e ConteggioQuery.
  • Re: Query per contare record con distinct e count

    Avevo provato ad usare il dcount in vb nel report finale ma c'era qualche problema con l espressione
    La soluzione mi sembra ottimasi, dopo provero a integrarla
    Non riesco a seguirti sulla questione dell'automazione sfruttando DAO, nel senso ho capito la funzione ma non ho idea di come implementarla!
  • Re: Query per contare record con distinct e count

    Leggi attentamente questo
    "forum.masterdrive.it/access-79/access-leggere-scrivere-dati-nelle-tabelle-tramite-vba-dao-13176/"
  • Re: Query per contare record con distinct e count

    Facciamo un passo inditero, sto provando a creare la tabella di calcolo, ma nonso esattamente dove inserire i valori
    OPer il campo nome query ho usato tipo dati "testo Breve" e poi nel campo ricerca ho collegato tramite casella combinata la query e il campo id, quello da contare
    Gia qua mi sembra che forse non è corretto
    Per il campo conteggio query, sto provando a inserire la funzione COUNT nel Valore Predefinito, ma mi da errore, non sodove metterla la funzione!
    ho provato a fare il campo "CALCOLATO" ed inserire l'espressione nell appostio riquadro, ma mi dice che l espressione DCOUNT non puo essere utilizata in una colonna calcolata
  • Re: Query per contare record con distinct e count

    La tabella non è di calcolo. In quanto TABELLA occorre inserirvi DENTRO manualmente o passo passo grazie alla routine che ti ho suggerito. Se la tabella fosse di calcolo...allora a che servono le query?

    Dal link che ti ho suggerito devi in sostanza aprire la tabella RiepilogoTrimestrale, entrare in ogni campo e SCRIVERE/IMPOSTARE un valore. Quello testuale NomeQuery potrebbe essere il NomeQuery stesso oppure una descrizione più estesa/esplicita/comprensibile, quello Numerico ConteggioQuery ci deve andare a finire il valore desunto da DCount (ecc...). Poi devi posizionarti di nuovo su NuovoRecord e impostare di nuovo. Questa operazione la devi ripetere per tutte le query. Se lo facessi manualmente sarebbe un mezzo bagno di sangue. Se ci sbatti un po' la testa a mettere su quella routine, puoi richiamarla ogni trimestre facilmente. Bada bene che io ho semplificato il discorso. Può darsi che tu vorrai tenere traccia di tutti i valori trimestre per trimestre. Direi per tanto di aggiungere in tabella RiepilogoTrimestre un campo (forse testo breve) dove specifichi questo.
  • Re: Query per contare record con distinct e count

    Non ho capito dove devo inserire i valori
    Se apro la tabella in viusualizzazione struttura ho nome campo e tipo dati
    Nome campo ok, query e conteggio
    tipo dati..cosa metto?dove specifico il nome della query da usare e dove metto l'espressione dcount?

    nel frattempo
    Sembra che sono riuscito usando la funzione conteggio e solo un campo
    Ho creato il campo e con ricerca guidata ho inserito la query e il campo ID che è l unico che mi serve per contare
    Poi su origine riga ho aperto il generatore di query e imposTATO IL VALORE DI conteggio per il campo id
    Ottengo il risultato, anche se aprendo la tabella il campo appare come casella combinata e il record è vuoto, cliccando sulla tendina trovo il valore
    Ho messo due query e sembra che va
    che dici puo andare?Certo in questo modo credo non posso fare l'automazione e sara un po un bagno di sangue, ma per il moimento voglio trovare una soluzione che comprendo, una volta ottenuta provo a studiare l'automazione che sembra complessa, e vedo se posso implemenmtarla
  • Re: Query per contare record con distinct e count

    Il problema del modo che ho trovato io è che risultando il record vuoto, quando nel report finale richiamo ilcampo della tabella che dovrebbe contenere il valore, mi restituisce niente. Ppero il valore lo calcola..
  • Re: Query per contare record con distinct e count

    stefanocps ha scritto:


    Non ho capito dove devo inserire i valori
    Se apro la tabella in viusualizzazione struttura ho nome campo e tipo dati
    Nome campo ok, query e conteggiotipo dati..cosa metto?
    dove specifico il nome della query da usare e dove metto l'espressione dcount?
    IDRiepilogo (PK)(numerazione automatica, chiave primaria)
    NomeQuery (testo breve)
    ConteggioQuery (numerico)
    Trimestre (testo breve)(ci puoi scrivere per esempio 2018/01-2018/03; 2018/04-2018-06; 2018/07-2018/09; 2018/10-2018/12)
    Non devi scrivere alcun DCount da nessuna parte. Questa è una volgare tabella come tutte le altre. I valori andranno inseriti manualmente (se non sei pratico di automatizzazioni). Una volta compresa l'automatizzazione da implementare ti giochi la carta del codice VBA ecc...come suggerito prima.

    stefanocps ha scritto:


    nel frattempoSembra che sono riuscito usando la funzione conteggio e solo un campoHo creato il campo e con ricerca guidata ho inserito la query e il campo ID che è l unico che mi serve per contarePoi su origine riga ho aperto il generatore di query e imposTATO IL VALORE DI conteggio per il campo idOttengo il risultato, anche se aprendo la tabella il campo appare come casella combinata e il record è vuoto, cliccando sulla tendina trovo il valoreHo messo due query e sembra che vache dici puo andare?Certo in questo modo credo non posso fare l'automazione e sara un po un bagno di sangue, ma per il moimento voglio trovare una soluzione che comprendo, una volta ottenuta provo a studiare l'automazione che sembra complessa, e vedo se posso implemenmtarla
    Qua non ti seguo più. Tu forse vorresti avere un'altra tabella Queries in cui elenchi tutti i nomi-propri delle query. Questi valori vuoi che siano la casella combinata di RiepilogoTrimestrale.NomeQuery. OK, lo puoi fare, ma la sostanza non cambia.

    stefanocps ha scritto:


    Il problema del modo che ho trovato io è che risultando il record vuoto, quando nel report finale richiamo ilcampo della tabella che dovrebbe contenere il valore, mi restituisce niente. Ppero il valore lo calcola..
    Aspetta stefanocps, dici troppe cose che tu vedi sul tuo monitor e dai per scontate, ma non ci racconti cosa c'è sotto usando i nomi propri.
    Vorrei inoltre farti capire che la strada che ti sto proponendo resetta molti dei ragionamenti fatti prima, dove avevi accavallato risultati di query su query ecc...
  • Re: Query per contare record con distinct e count

    OsvaldoLaviosa ha scritto:


    stefanocps ha scritto:


    Non ho capito dove devo inserire i valori
    Se apro la tabella in viusualizzazione struttura ho nome campo e tipo dati
    Nome campo ok, query e conteggiotipo dati..cosa metto?
    dove specifico il nome della query da usare e dove metto l'espressione dcount?
    IDRiepilogo (PK)(numerazione automatica, chiave primaria)
    NomeQuery (testo breve)
    ConteggioQuery (numerico)
    Trimestre (testo breve)(ci puoi scrivere per esempio 2018/01-2018/03; 2018/04-2018-06; 2018/07-2018/09; 2018/10-2018/12)
    Non devi scrivere alcun DCount da nessuna parte. Questa è una volgare tabella come tutte le altre. I valori andranno inseriti manualmente (se non sei pratico di automatizzazioni). Una volta compresa l'automatizzazione da implementare ti giochi la carta del codice VBA ecc...come suggerito prima.
    allora mi fermo un attimo qua poi eventualmente riprendo il discorso dell altra strada che avevo trovato

    Ho difficolta a capire come funziona questa cosa che proproni tu che mi sembra buona
    Creo tabella con i campi nominati come dici e deltipo che dici
    E fin qua ok
    Ora se capisco bene bisogna semplicemente popolare la tabella dei risultati giusto?
    e questo si puo fare con l'automazione, dove con un codice vb inseriro automaticamente nome query e conteggio nei rispettivi campi
    Oppure tu dici manualmente
    Ma questo significherebbe scrivere dentro la tabella tutti i valori di conteggio che avro trovato aprendo le query, ovvero scrivere per ogni query il numero di risultanze, tutto manualmente?
    Se è questo che mi dici mi sembra una strada non percorribile perchè non utile, ma forse non capisco io ?
    La tabella in questo caso avrebbe senso farla solo se automatizzata
  • Re: Query per contare record con distinct e count

    Supponiamo tu hai 5 query con i seguenti nomi:
    Apollo
    Urano
    Nettuno
    Atena
    Zeus

    Ognuna di queste query avrà 5 corrispondenti DCount. Sto benedetto DCount è un valore che ricavi immediatamente.

    Se lavorassi manualmente:
    1. Apri la tabella RiepilogoTrimestre
    2. Ci scrivi dentro Apollo e dentro ConteggioQuery il suo relativo DCount. Qua potresti anche mettere, se sfrutti una maschera, l'evento "Dopo aggiornamento" del relativo campo NomeQuery, l'impostazione valore DCount. Ma non è su questo terreno che voglio migliorare la tua situazione.
    3. Continui a compilare altri 4 record alla stessa maniera, manualmente

    Se lavorassi con una routine VBA (non posso scrivere tutto, se no è "pappa pronta"):
    1. Tu apri la tabella RiepilogoTrimestrale (con tutte quelle istruzioni "obbligatorie da rispettare" come da link suggerito)
    2. Il cursore (MoveNext) si va a posizionare su RecordNuovo, quindi, se imposti una variabile di tipo DAO.Recordset di nome rs
    rs!NomeQuery = "Apollo"
    rs!ConteggioQuery = DCount("*", "Apollo")
    rs!Trimestre = "un valore testuale che mo non mi va di impostare...devi capire tu come destreggiarti…"
    rs.Update
    rs.MoveNext
    rs!NomeQuery" = "Urano"
    rs!ConteggioQuery = DCount("*", "Urano")
    rs!Trimestre = ecc
    
    ...e fai così per tutte le query
    Sia chiaro che ti ho esposto un possibile codice VBA molto-molto-molto volgare. Sfruttando altri stratagemmi...mi pare che si possano indicizzare le query con una numerazione che potresti ciclare in tutt'altro modo snellendo drasticamente tutto il codice. Io qui non sono tanto bravo, ti lascio a ricerche più evolute o consigli di utenti più esperti.
Devi accedere o registrarti per scrivere nel forum
57 risposte