Ottimo adesso cerco di capire.
Devo costruire una tabella calendario ma mi dici
cosa intendi esattamente?
Poi non capisco come vai a valorizzare il campo per avere le presenze, cioè come leggi ogni singolo record della Tabella dati e valorizzi le date per avere le presenze da contare alla fine per ogni giorno?
Io, nella mia ignoranza, avevo pensato a qualcosa del genere... ma non so come realizzarlo.
codice:01 LEGGI TABELLA REPORT 02 Valorizza variabile DATA con 01/01/2018 03 Valorizza variabile [CONT PRES] con 0 04 Posizionati su record X = 1 05 CONFRONTA variabile DATA se maggiore di [DATA AUTORIZZAZIONE] E minore di [DATA CHIUSURA] SE SI aggiungi uno a variabile [CONT PRES] SE NO aggiungi 0 06 SE Record X+1 ha campo [SERIAL VALORIZZATO] allora SPOSTATI SU Record X+1 E ESEGUI 05 07 SE NO scrivi su tabella volatile presenze campo uno valore in variabile [DATA] e in campo due il valore di variabile [CONT PRES] aggiungi uno a variabile DATA Valorizza variabile [CONT PRES] con 0 SE variabile DATA minore di 31/12/2020 allora da 04 SE NO STOP.
sbs, prova la query di marino51, fa già tutto
un consiglio, le date memorizzale in formato Date/DateTime, non text
si il calendario (in join con presenze) consente una sorta di "foreach" fatto con una query anziche con un altro linguaggio, non badare alla sintassi ma questa é la tabella calendario
codice:DECLARE @calendario TABLE( DATA_ANALISI datetime );
ora trovi in successione le tre query ( varianti della stessa ma se noti, uguali ) che mi hanno permesso di controllare il risultato
nel post precedente, ti ho passato solo l'ultima che calcola i valori necessaricodice:-- elenco delle righe di presenza estratte ed utili per il calcolo SELECT SERIAL , ID_APERTURA , STATO , CONVERT(varchar, DATA_RICHIESTA, 23) AS DATA_RICHIESTA , CONVERT(varchar, DATA_AUTORIZZAZIONE, 23) AS DATA_AUTORIZZAZIONE , CONVERT(varchar, DATA_CHIUSURA, 23) AS DATA_CHIUSURA , CONVERT(varchar, DATA_ANALISI, 23) AS DATA_ANALISI FROM calendario, presenze WHERE STATO = 'CHIUSA' AND NOT (DATA_ANALISI < DATA_AUTORIZZAZIONE OR DATA_CHIUSURA < DATA_ANALISI) ORDER BY DATA_ANALISI, DATA_AUTORIZZAZIONE -- estrazione date di presenza e numero di presenti SELECT CONVERT(varchar, DATA_ANALISI, 23) AS DATA_ANALISI , count(DATA_ANALISI) AS PRESENZE FROM calendario, presenze WHERE STATO = 'CHIUSA' AND NOT (DATA_ANALISI < DATA_AUTORIZZAZIONE OR DATA_CHIUSURA < DATA_ANALISI) GROUP BY DATA_ANALISI ORDER BY PRESENZE DESC, DATA_ANALISI -- calcolo valori SELECT CONVERT(varchar, min(DATA_ANALISI), 23) AS MIN_ANALISI , CONVERT(varchar, max(DATA_ANALISI), 23) AS MAX_ANALISI , count(DATA_ANALISI) AS NUMERO_GIORNI , sum(PRESENZE) AS NUMERO_PRESENZE , min(PRESENZE) AS MIN_PRESENZE , max(PRESENZE) AS MAX_PRESENZE , CONVERT(decimal(10,6), sum(PRESENZE)) / CONVERT(decimal(10,6), count(DATA_ANALISI)) AS AVG_PRESENZE FROM ( SELECT CONVERT(varchar, DATA_ANALISI, 23) AS DATA_ANALISI , count(DATA_ANALISI) AS PRESENZE FROM calendario, presenze WHERE STATO = 'CHIUSA' AND NOT (DATA_ANALISI < DATA_AUTORIZZAZIONE OR DATA_CHIUSURA < DATA_ANALISI) AND ( DATA_ANALISI BETWEEN '2019-01-01' AND '2019-01-31' ) GROUP BY DATA_ANALISI ) x
ora hai la possibilità di vedere anche i passaggi intermedi
ps per le prove uso tabelle temporanee ma non modificano il risultato
Ultima modifica di marino51; 10-06-2021 a 17:16
la tabella dati si chiama REPORT
cerco di rimetterla in access ma non ho capito come hai creato la "tabella calendario con le date da analizzare da 2018-12-18 fino a 2019-04-12 "(DATA_ANALISI)che non ho ben capito?codice:AND ( DATA_ANALISI BETWEEN '2019-01-01' AND '2019-01-31' )
la tabella calendario la puoi creare con un copia & incolla da Excel
Ho provato a rieditare il tutto
ecco le mie 3 query
il risultato è stato:codice:QUERY UNO SELECT REPORT.Serial, REPORT.ID_apertura, REPORT.STATO, REPORT.[data richiesta], REPORT.[DATA AUTORIZZAZIONE], REPORT.[data chiusura], DATA_ANALISI.DATA FROM REPORT, DATA_ANALISI GROUP BY REPORT.Serial, REPORT.ID_apertura, REPORT.STATO, REPORT.[data richiesta], REPORT.[DATA AUTORIZZAZIONE], REPORT.[data chiusura], DATA_ANALISI.DATA HAVING (((REPORT.STATO)="chiusa") AND ([DATA AUTORIZZAZIONE]<[DATA]) AND ([data chiusura]>[DATA])); QUERY DUE SELECT uno.[DATA], Count(uno.[ID_apertura]) AS PRESENZE FROM uno GROUP BY uno.[DATA] ORDER BY uno.[DATA]; QUERY TRE SELECT Count(DUE.data) AS [CONTA GIORNI], Min(DUE.PRESENZE) AS MINIMO, Max(DUE.PRESENZE) AS MASSIMO, Avg(DUE.PRESENZE) AS MEDIA FROM DUE;
CONTA GIORNI MINIMO MASSIMO MEDIA 364 1 11 5,51648351648352