Query su base trimestrale

di il
37 risposte

37 Risposte - Pagina 2

  • Re: Query su base trimestrale

    Nel merito a quanto esplicitato:

    stefanocps ha scritto:


    ho bisogno comunque dell’inizio trattamento e fine trattamento. Questo serve per l'archiviazione interna, oggi le schede di carta riportano questi dati, servono per vedere l'andamento del paziente quando ritorna
    Visto che vuoi automatizzare la procedura, attualmente cartacea, devi valutare quale sia la modalità con cui stabilisci l'inizio e la fine del trattamento.
    Ad esempio se hai Tizio che viene il 31 marzo (ed inizia il trattamento) ma poi non si presenta più. quando vai a porre il fine trattamento? Inoltre come lo devi considerare nel secondo trimestre ?

    stefanocps ha scritto:



    Inserire la data del trattamento, se intendi quella del giorno in cui è stato trattato, significherebbe aggiornare ogni giorno la tabella per diverse decine di pazienti e non c'è nessuno che lavora giornalmente al db
    Anche se non si è davanti al computer, si può pensare ad un processo che al termine della giornata effetti un inserimento dei soggetti che sono stati trattati.
    Ciò permette di ottenere una situazione giornaliera corretta ed affidabile (come ti è stato già suggerito) e nel contempo avere anche la situazione trimestrale.
    Stabilendo una modalità prestabilita si è certi di aggiornare i dati nella giusta frequenza.

    stefanocps ha scritto:


    C'è chi viene per anni regolarmente, chi viene 2, 3 mesi poi smette per 6 e poi ritorna per 1 mese e poi smette...insomma è una modalità assolutamente variabile e imprevedibile
    Se non vi è una modalità certa di aggiornamento temporale dei dati come fai a stabilire quando si è interrotto, un trattamento che magari hai lasciato aperto per un tempo immemorabile?
    E come fai a stabilire che inizia un nuovo trattamento se non con intervento umano che valuti lo specifico caso.

    stefanocps ha scritto:



    Quindi il db serve essenzialmente a questo, raccogliere il profilo dell utente per poi inviarlo alla prefettura
    Vista l'esigenza essenziale di comunicazione alla prefettura, per ottemperare alla normativa è chiaro che i dati trasmessi devono essere quelli veritieri.

    stefanocps ha scritto:



    Avevo pensato ad un campo che si aggiornasse automaticamente con la funzione oggi e si fermasse quando do un determinato comando. Potrebbe funzionare forse?
    Assurdo, in quanto come fai ad accertare se il soggetto è o meno presente (a meno di non inserire una elemento discriminante posto da un operatore che certifichi se il trattamento è stato effettuato, oppure no, nel periodo in esame),

    In conclusione consiglio di effettuare una propedeutica, approfondita analisi (altrimenti rischi di implementare una procedura contorta, non soddisfacente e non in regola con i requisiti normativi).
  • Re: Query su base trimestrale

    In realtà credo che il cartaceo per ora rimanga, perchè è dove ogni giorno viene inserita la terapia
    C'è un sistema di posizionamento schede per cui se uno non viene per un po di tempo la scheda risalta in evidenza e dopo un mese si mette tra quelli che hanno interrotto
    A quel punto si risale all'ultima data di somministrazione per definire chiuso il trattamento
    Ovviamente questo modo di lavorare nasce dal fatto che non si possono avere centinaia di schede sempre a disposizione, per cui la scheda di chi dopo un mese non viene piu viene messa in archivio, per poi venire recuperata se dovesse tornare.
    Ecco che sta qua la grande differenza col db, dove questa esigenza non c'è e allora il moitoring della continuita di trattamento puo cambiare, non sara piu necessario un data iniziuo e un data fine, ma probabilmnte un polling continuo

    Ma certo se si vuole lavoreare in questo modo sul db,, è necessario che il db sostituisc aintegralmente il cartaceo perchè allora ci sono dati aggiornati giornalmente e probabilmente diventerebbe più facile anche la ricerca
    Una cosa che mi sembra chiara è che a questo punto è necessario che parli con gli operatori e sapere quali sono le effettive intenzioni
    Io credo volessero solo semplificare l operazione del report trimestrale, quindi lavorare sul db peruiodicamente (una volta inserite le schede dei paziuenti) e poi proseguire col cartaceo
    Mi sembra che cosi sia piu complesso. Il db deve svolgere esattamente il ruolo del cartaceo
    che ne dite?
  • Re: Query su base trimestrale

    Allora ho un aggiornamento
    L utente lavora piu o meno settimanalmente al db aggiornandolo e soprattutto a fine trimestre "chiude tutti i trattamenti (per poi riaprili il giorno del trimestre successivo)
    QUindi secondo me i periodi dal al vanno bene e servono a loro per ricerche interne, mentre per il report della prefettura a questo punto per semplificare basterebbe un check box che venga spuntato dll operatore se nel trimestre c'è stato trattamento. A fine anno avverra la stessa cosa, se nell'anno è stato trattato ci sara un check box che dara il dato
    Puo essere più semplice cosi?
  • Re: Query su base trimestrale

    Visto che al termine del trimestre l'utente è in grado di chiudere i trattamenti, ha anche a disposizione le date "dal", "al" per cui è sufficiente basare (su queste) il report per la Prefettura.
    Effettuare ulteriori operazioni (su check-box o di fine anno) appaiono superflue.
  • Re: Query su base trimestrale

    Il fatto del checkbox e solo perche mi e piu facile rilevarlo. Col dal al che tipo di condizione dovrei cercare? Dovrei interrogare il Al e vedere se e l ultimo giorno del mese? Col check me la cavavo con una query, ma certo preferirei farlo direttamente con la data
  • Re: Query su base trimestrale

    stefanocps ha scritto:


    Col check me la cavavo con una query, ma certo preferirei farlo direttamente con la data
    Inserire dati ridondanti nella base dati, oltre che andare contro i criteri della normalizzazione, in terza forma normale (ove tutti gli attributi non-chiave dipendono solo dalla chiave e non esistono attributi non-chiave che dipendono da altri attributi non-chiave) rende anche più complicata la gestione da parte dell'utente, in quanto deve agire su due elementi (check-box e data) invece di uno solo.

    stefanocps ha scritto:


    Dovrei interrogare il Al e vedere se e l ultimo giorno del mese?
    No, dovrai valutare se il valore del campo "Dal" ed "Al" ricadono nell'intervallo del trimestre in esame, in quanto il periodo di trattamento può essere sovrapponibile in tutto, in parte (prima o dopo) o meno di quello trimestrale.

    Per le istruzioni sulle date, @Alex ti ha già fornito un esempio esaustivo, io aggiungo qualcosa per partire:
    https://www.techonthenet.com/access/queries/parameter1.php
    https://debradalgleish.com/blog/2017/08/26/access-query-date-criteria-examples/
    https://www.fontstuff.com/access/acctut03.ht
    https://www.plus2net.com/sql_tutorial/between-date.ph
    https://www.599cd.com/blog/display-article.asp?ID=72
    https://www.cnet.com/forums/discussions/ms-access-between-dates-queries-using-variables-from-forms-397774/
  • Re: Query su base trimestrale

    Sto fcendo delle semplici query per conoscere meglio le funzioni data
    ho fatto questa query
    SELECT date_trattamenti.ID, date_trattamenti.dal, date_trattamenti.al, date_trattamenti.[tipo di trattamento]
    FROM date_trattamenti
    WHERE (((date_trattamenti.dal)>="30/01/2018" And (date_trattamenti.dal)<="30/12/2018"));

    ma ricevo errore "tipo di dati non corrispondenti nell espressione criterio"
    nella tabella date_trattamenti il campo DAL è nel formato 01/11/2018

    ho provarto anche con
    SELECT *
    FROM date_trattamenti
    WHERE dal BETWEEN '30/01/2018' AND '30/12/2018'
    e ricevo lo stesso errore
    cosa sbaglio?

    Dal punto di visto della logica credo basti interrogare la data DAL per capire se ricade nel trimestre
  • Re: Query su base trimestrale

    Non stai impiegando la corretta sintassi per i criteri che prevedono il tipo data:
    https://support.office.com/it-it/article/esempi-dell-uso-di-date-come-criteri-in-query-di-access-aea83b3b-46eb-43dd-8689-5fc961f21762
  • Re: Query su base trimestrale

    willy55 ha scritto:


    Non stai impiegando la corretta sintassi per i criteri che prevedono il tipo data:
    https://support.office.com/it-it/article/esempi-dell-uso-di-date-come-criteri-in-query-di-access-aea83b3b-46eb-43dd-8689-5fc961f21762
    ho copiato esattamente dagli esempi dei link precedenti!
    comunque da questo nuovo link ho trovato la sintassi corretta

    SELECT date_trattamenti.ID, date_trattamenti.dal, date_trattamenti.al, date_trattamenti.[tipo di trattamento]
    FROM date_trattamenti
    WHERE (date_trattamenti.dal) BETWEEN #30/01/2018# AND #30/12/2018#;


    questo funziona!
    ottimo, una buona base per partire

    Ora se voglio contare il numero dei record restituiti come faccio?
    tenendo conto che nell arco di un trimesre potrebbero esserci piu di un ciclo di trattamenti dovrei poter raggrupare i risultati per id prima di contarli
    esempio
    ID dal al tipo di trattamento
    7 14/11/2018 25/12/2018 Farmacologico
    8 02/09/2018 02/10/2018 Farmacologico
    8 01/11/2018 11/11/2018 Farmacologico
    11 10/10/2018 31/11/2018 Metadone
    l utente con id 8 ha avuto due cicli e dovrei contarne uno solo
    Questo sicuramente si accentua nel report annuale
  • Re: Query su base trimestrale

    stefanocps ha scritto:


    ho copiato esattamente dagli esempi dei link precedenti!
    No, se avessi letto più attentamente il secondo link, avresti già avuto un esempio con le date (poste fra il carattere cancelletto "#") inoltre per offrirti una panoramica più ampia vedi che alcuni degli esempi fanno riferimento all'impiego di una query con parametri variabili (tu invece hai impiegato dei valori fissi per le date).

    stefanocps ha scritto:


    Ora se voglio contare il numero dei record restituiti come faccio?
    Leggi la guida per quanto riguarda la funzionalità di conteggio:
    https://support.office.com/it-it/article/conteggiare-dati-tramite-una-query-b84cdfd8-07ba-49a7-b067-e1024ccfcca8

    stefanocps ha scritto:


    tenendo conto che nell'arco di un trimestre potrebbero esserci più di un ciclo di trattamenti dovrei poter raggruppare i risultati per id prima di contarli
    Vedi, nella sintassi SQL della query, i predicati DISTINCT, DISTINCTROW, TOP:
    https://support.office.com/it-it/article/predicati-all-distinct-distinctrow-top-24f2a47d-a803-4c7c-8e81-756fe298ce57
    http://www.fmsinc.com/microsoftaccess/query/distinct_vs_distinctrow/unique_values_records.asp
    https://support.microsoft.com/it-it/help/292634/how-to-use-a-query-to-filter-unique-data-in-access

    Tieni presente che per valutare l'univocità di ciascun record dovrai stabilire il criterio con cui vuoi la singolarità fra i vari campi presenti (ID, tipo di trattamento, periodo).
    Inoltre visto che nel codice postato hai preso in considerazione solo la data "Dal" hai valutato un trattamento a cavallo degli anni, ad esempio che inizi nel 2017 e termini nel 2018?
  • Re: Query su base trimestrale

    L operatore ad ogni fine trimestre rimette la data di inizio, chiude il precedente e ricomincia il nuovo partendo dal 1 giorno del nuovo trimestre, anche se si tratta di continuità, quindi da questo punto di vista non mi pare ci sia problema

    le date fisse le ho usate per vedere se riuscivo, una prova semplificata, inseriro poi i campi a valore variabile
    per l 'univocità, nel moment oin cui ho piu record selezionati dalla record, devo solo verificare che l'id sai diverso, id uguale sono della stessa persona e contano sempre 1

    ho prpovato la funzione distinct
    SELECT DISTINCT date_trattamenti.ID
    WHERE (((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#));

    cosi mi restituisce giustamente un solo valore con ID 8
    Pero non posso inserire altri campi perchè giustamente mi rivisualizza 2 volte l ID 8 essendo i valori degli altri campi diversi
    come si fa?
  • Re: Query su base trimestrale

    Pensandoci bene non mi serve vedere gli altri campi, questa funzione la uso solo per contare il numero di record ottenuti
    ora ho fatto una prova di CONTEGGIO usando questa espressione
    sono riuscito a contare
    adesso dovro estendere la query oltree che al periodo a diversi campi

    Pensavo di creare un report che selezionando l intervallo di date mi restituisse direttamente i numeri
    COme inserisco nel report i valori ottenuti dal conteggio?
  • Re: Query su base trimestrale

    Non mi funziona il conteggio
    con questa istruzione
    SELECT DISTINCT Count(date_trattamenti.ID) AS ConteggioDiID
    FROM date_trattamenti
    HAVING (((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#));


    se conto
    ID dal al tipo di trattamento
    7 23/11/2017 24/01/2018 Metadone
    7 14/11/2017 25/12/2018 Farmacologico
    8 02/10/2018 02/10/2018 Farmacologico
    8 01/11/2018 11/11/2018 Farmacologico
    9 02/10/2018 11/11/2018 Metadone
    11 10/10/2018 10/12/2018 Metadone

    il conteggio mi da 4
    ma se uso solo IL DISTINCT e tolgo il conteggio mi restituisce 3 record..

    se uso questo
    SELECT DISTINCT Count(date_trattamenti.ID) AS ConteggioDiID
    FROM date_trattamenti
    GROUP BY date_trattamenti.dal
    HAVING (((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#));

    la query mi da
    1
    2
    dov'è l errore?
  • Re: Query su base trimestrale

    Stai facendo un guazzabuglio nell'impiego del conteggio, che è legato ai dati su cui effettui il raggruppamento e/o l'impiego del predicato DISTINCT in base ai campi selezionati.
    Cerco di fornirti degli esempi a partire dai dati da te postati.

    Tabella originaria

    ID dal al tipo di trattamento
    7 23/11/2017 24/01/2018 Metadone
    7 14/11/2017 25/12/2018 Farmacologico
    8 02/10/2018 02/10/2018 Farmacologico
    8 01/11/2018 11/11/2018 Farmacologico
    9 02/10/2018 11/11/2018 Metadone
    11 10/10/2018 10/12/2018 Metadone


    ove dei sei record se ne selezionano quattro (appartenenti all'intervallo del 2018):
    ID dal al tipo di trattamento
    8 02/10/2018 02/10/2018 Farmacologico
    8 01/11/2018 11/11/2018 Farmacologico
    9 02/10/2018 11/11/2018 Metadone
    11 10/10/2018 10/12/2018 Metadone



    ciò è possibile, ad esempio, impiegando una semplice query il cui codice SQL è il seguente:
     
    SELECT date_trattamenti.ID, date_trattamenti.dal, date_trattamenti.al, date_trattamenti.[tipo di trattamento]
    FROM date_trattamenti
    WHERE (((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#));
    


    oppure questo con costrutto più complesso (avendo GROUP BY ... HAVING ... ORDER BY ...) ma di medesimo risultato:
     
    SELECT date_trattamenti.ID, date_trattamenti.dal, date_trattamenti.al, date_trattamenti.[tipo di trattamento]
    FROM date_trattamenti
    GROUP BY date_trattamenti.ID, date_trattamenti.dal, date_trattamenti.al, date_trattamenti.[tipo di trattamento]
    HAVING (((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#))
    ORDER BY date_trattamenti.ID;
    



    Ora agendo con lo stesso criterio del periodo in esame ((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#) se si volesse un conteggio dei record presenti (per ciascun ID); un esempio è il seguente:
     
    SELECT date_trattamenti.ID, Count(date_trattamenti.ID) AS ConteggioDiID
    FROM date_trattamenti
    WHERE (((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#))
    GROUP BY date_trattamenti.ID;
    

    ID ConteggioDiID
    8 2
    9 1
    11 1

    Lo stesso risultato si ottiene inserendo il predicato DISTINCT:
     
    SELECT DISTINCT date_trattamenti.ID, Count(date_trattamenti.ID) AS ConteggioDiID
    FROM date_trattamenti
    WHERE (((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#))
    GROUP BY date_trattamenti.ID;
    

    ID ConteggioDiID
    8 2
    9 1
    11 1

    Qualora il predicato DISTINCT sia basato su un solo campo calcolato e non vi siano raggruppamenti avremo un conteggio totale dei record in esame:
     
    SELECT DISTINCT Count(date_trattamenti.ID) AS ConteggioDiID
    FROM date_trattamenti
    WHERE (((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#));
    

    ConteggioDiID
    4

    Mentre se prendiamo l'esempio da te postato, potrei notare che effettui un raggruppamento (non necessario) ed ottieni i due valori:
     
    SELECT DISTINCT Count(date_trattamenti.ID) AS ConteggioDiID
    FROM date_trattamenti
    GROUP BY date_trattamenti.dal
    HAVING (((date_trattamenti.dal) Between #1/30/2018# And #12/30/2018#));
    

    ConteggioDiID
    1
    2

    Tieni presente che come riportato nella guida per il predicato DISTINCT

    Per essere inclusi nei risultati della query, i valori per ogni campo elencato nell'istruzione SELECT devono essere univoci.

    https://support.office.com/it-it/article/predicati-all-distinct-distinctrow-top-24f2a47d-a803-4c7c-8e81-756fe298ce57
    mentre la tua SELECT DISTINCT è basata su un solo campo calcolato di conteggio (e quindi ha poco senso);
    inoltre, dopo il raggruppamento (tramite "GROUP BY") impiegare la clausola "HAVING"
    https://support.office.com/it-it/article/clausola-having-64c52dba-5cda-45c5-98b5-bd155a89f02f
    qualora questo (date_trattamenti.dal) non sia necessario, poteva essere risolto con una semplice "espressione" senza la necessità della clausola "HAVING", come in alcuni degli esempi sopra riportati.

    In ogni caso ti consiglio di approfondire lo studio e riflettere sui dati che devi ottenere, magari poi procedere (non a tentativi) a valutare i campi (calcolati o meno) che devono confluire nella query risultante.

    PS quando alleghi del codice, come previsto dalle norme del forum devi racchiuderlo fra tag-code.
  • Re: Query su base trimestrale

    Grazie per l'esaustività delle spiegazioni ed esempi che mi hai fornito. Pero da quella tabella io devo poter aver come risultato 3, perchè a me serve contare quanti ID nel trimestre siano stati trattati, e ID 8 va contato una volta sola
    I dati da ottenere sono dei conteggi, semplicementi il numero di utenti trattati nel trimestre e che selezionero ulteriormente per diversi parametri(eta, tipo di sostanza usata ecc...)
    Il Trattamento.DAL è quindi necessario per stabilire se l'utente è trattato nel trimestre perchè il primo parametro di selezione è il periodo, poi aggiungero selettivamente gli altri
    Quindi in tutti questi esempi non c'è un espressione che funziona nel mio caso, dove dovrei avere come risultato 3
    COme ho gia detto, la funzione del db è produrre un resoconto di numeri a fine trimestre (e a fine anno) del NUMERO DI UTENTI TRATTATI secondo diverse modalità di raggruppameto. All'operatore basta avere un report conla lista di numeri conseguente, non serve altro
Devi accedere o registrarti per scrivere nel forum
37 risposte