Ottenimento valori presenze istantanee

Apteco

Nuovo Utente
16 Apr 2020
5
1
3
Ciao,

ho provato a cercare in questa sezione ma non ho trovato nulla che corrisponda al mio caso...

Ho una tabella che contiene (tra gli altri) questi campi:
data_presenza
ora_ingresso
ora_uscita

Ora, io vorrei "consolidare" le righe di questa tabella andando ad ottenere quante presenze ho per varie fasce orarie, in pratica andare a fare una "foto" del numero di presenze ogni venti minuti.
Premessa: ingressi e uscita so

Il top sarebbe avere una tabella strutturata con i campi
Data
Presenze alle 7.00
Presenze alle 7.20
Presenze alle 7.40
...
Presenze alle 17.40
Presenze alle 18.00

e i vari valori relativi.

Per farlo pensavo di concatenare delle query del tipo "select data_presenza, count(*) where ora_ingresso < '7:00:00' and ora_uscita >= '7:00:00' etc, per ogni fascia oraria....
però poi dovrei creare una view per ognuna e fare una query che pesca da ognuna di queste view facendo un join sulla data_presenza....

C'è un modo più facile per ottenere questi dati?

Spero di essere stato abbastanza chiaro nella presentazione....

Grazie a chi saprà darmi una risposta
 

marino51

Utente Attivo
28 Feb 2013
2.912
162
63
Lombardia
potresti usare una query composta (scusa se la definisco un po' schifezza), ma funziona,

SQL:
select data_presenza, '07:00:00' as ora_presenza, count(*) as conta_presenze from tabella where '07:00:00' between ora_ingresso and ora_uscita group by data_presenza
union
select data_presenza, '07:20:00' as ora_presenza, count(*) as conta_presenze from tabella where '07:20:00' between ora_ingresso and ora_uscita group by data_presenza
union
select data_presenza, '07:40:00' as ora_presenza, count(*) as conta_presenze from tabella where '07:40:00' between ora_ingresso and ora_uscita group by data_presenza
union
select data_presenza, '08:00:00' as ora_presenza, count(*) as conta_presenze from tabella where '08:00:00' between ora_ingresso and ora_uscita group by data_presenza
union
select data_presenza, '08:20:00' as ora_presenza, count(*) as conta_presenze from tabella where '08:20:00' between ora_ingresso and ora_uscita group by data_presenza
union
select data_presenza, '08:40:00' as ora_presenza, count(*) as conta_presenze from tabella where '08:40:00' between ora_ingresso and ora_uscita group by data_presenza
union
select data_presenza, '09:00:00' as ora_presenza, count(*) as conta_presenze from tabella where '09:00:00' between ora_ingresso and ora_uscita group by data_presenza
union
select data_presenza, '09:20:00' as ora_presenza, count(*) as conta_presenze from tabella where '09:20:00' between ora_ingresso and ora_uscita group by data_presenza
union
select data_presenza, '09:40:00' as ora_presenza, count(*) as conta_presenze from tabella where '09:40:00' between ora_ingresso and ora_uscita group by data_presenza
RISULTATO

1587069447321.png


volendo mettere un filtro sulla data, potresti scrivere
SQL:
select * from (

qui inserisci le righe soprastanti

) t
where t.data_presenza = ....
 

Apteco

Nuovo Utente
16 Apr 2020
5
1
3
Ciao Marino, grazie ;-)

In realtà quello che vorrei ottenere io è una cosa del tipo

Schermata 2020-04-16 alle 23.27.00.png


dove P_7_00 indica le presenze alle 7.00 etc.

vorrei capire se ci sia uno strumento o modo per ottenerlo nel modo più rapido possibile, senza l'uso di troppe query concatenate

Grazie ancora
 
  • Wow
Reactions: f107

marino51

Utente Attivo
28 Feb 2013
2.912
162
63
Lombardia
1587073063311.png


Una persona dedica tempo per risponderti,
ma poi vanifichi il risultato di quel tempo,
proponendo una cosa totalmente diversa

inutile usare query, meglio scrivere del codice che risolve il problema magistralmente
 
  • Like
Reactions: f107

Apteco

Nuovo Utente
16 Apr 2020
5
1
3
In realtà ho cercato di spiegarmi meglio, poiché già nel primo messaggio scrivevo che i campi dovessero essere quelli (e non intendevo il contenuto delle varie righe).
Mi spiace di non essere stato altrettanto chiaro nel primo post, ma non ho mai inteso cambiare le carte in tavola.

La mia richiesta vorrebbe appunto evitare di usare codice esterno a mysql.

Grazie comunque per il tempo che mi hai dedicato ;-)
 

f107

Utente Attivo
7 Ago 2012
203
6
18
Roma
Ciao,

Quoto @marino51, con qualche linea di codice si risolveva molto facilmente, comunque provo a fare delle proposte che trovi qui: http://sqlfiddle.com/#!9/27459d/10

Ho immaginato la tabella presenze, mentre la tabella template l'ho usata per la prima proposta (che mi sembra la più dinamica e meno macchinosa).

Da come avevo compreso nel tuo primo post, la prima soluzione era più adatta (con le tabelle che hai descritto e l'ouput sembrava una soluzione verticale la tua richiesta).


Altrimenti, per rispondere agli sviluppi che ho letto, c'è la seconda opzione, ma perdonami sono uno sviluppatore, ergo sono profondamente pigro e annoiato dalle operazioni ripetitive, ho fatto uno script per creare le select clauses che servono in base all'orario minimo, il massimo e gli step necessari in minuti: https://repl.it/repls/SpicyPrevailingVertex se vuoi configurarlo cambia solo le variabili in maiuscolo e premi run. ( non non le avrai mai scritte a mano con copia e incolla tutte e tredici :eek:)

La seconda dovrebbe darti la soluzione che cerchi, ma non mi piace come soluzione (parere mio ovviamente), però puoi farci una view.
 

Apteco

Nuovo Utente
16 Apr 2020
5
1
3
Grazie mille a entrambi, provo a seguire questa via anche se non so se potrò utilizzare python....
Si tratta di un accesso esterno ad un server mysql e dovrei esporre quei dati sempre su una tabella per altri accessi da parte di terzi....
Provo a sistemare lo script python scrivendo i dati su una nuova tabella e utilizzandola come storico (non serve che siano dati live)...

Grazie mille
 

Apteco

Nuovo Utente
16 Apr 2020
5
1
3
Grazie mille a entrambi, provo a seguire questa via anche se non so se potrò utilizzare python....
Si tratta di un accesso esterno ad un server mysql e dovrei esporre quei dati sempre su una tabella per altri accessi da parte di terzi....
Provo a sistemare lo script python scrivendo i dati su una nuova tabella e utilizzandola come storico (non serve che siano dati live)...

Grazie mille
Rettifico, ho letto lo script.... grazie e basta.
 
  • Like
Reactions: f107