Raggruppare record con stessa data

Alex@1983

Utente Attivo
9 Mag 2015
126
2
18
Ciao a tutti,

avrei bisogno di un vostro consiglio su come poter raggruppare , e successivamente visualizzare su un'unica riga di una tabella, dei record che estraggo con una query MS SQL.

In pratica la query è una semplice select su una tabella di orari , contenente anche più record per una stessa data.

Esempio:
DATAORARIO
2020-08-090822
2020-08-091433
2020-08-091740
2020-08-092210
2020-08-100715
2020-08-101525

Quello che vorrei riuscire a rappresentare nella mia pagina PHP , è la visualizzazione di una sola riga ( per ogni data ) contenente tutti i vari orari

Esempio:

2020-08-090822143317402210
2020-08-1007151525

Il problema è che non mi sono mai scontrato con questa esigenza...e anche googolando in giro .... non riesco a capire come fare .

Potete darmi una mano ????

Grazie mille
 

Tommy03

Utente Attivo
6 Giu 2018
616
58
28
20
Vicenza
Non so se c'è un metodo più semplice, ma puoi provare così:
PHP:
$sql1 = mysqli_query($conn, "SELECT * FROM tabella GROUP BY data");
while($row1 = mysqli_fetch_assoc($sql1)){
$data = $row1['data'];
echo "<tr><td>$data</td>";
$sql2 = mysqli_query($conn, "SELECT * FROM tabella WHERE data='$data'");
while($row2 = mysqli_fetch_assoc($sql2)){
$orario = $row2['orario'];
echo "<td>$orario</td>";
}
echo "</tr>";
}
 

Alex@1983

Utente Attivo
9 Mag 2015
126
2
18
Non so se c'è un metodo più semplice, ma puoi provare così:
PHP:
$sql1 = mysqli_query($conn, "SELECT * FROM tabella GROUP BY data");
while($row1 = mysqli_fetch_assoc($sql1)){
$data = $row1['data'];
echo "<tr><td>$data</td>";
$sql2 = mysqli_query($conn, "SELECT * FROM tabella WHERE data='$data'");
while($row2 = mysqli_fetch_assoc($sql2)){
$orario = $row2['orario'];
echo "<td>$orario</td>";
}
echo "</tr>";
}

Niente, la query non funziona e mi restituisce un errore SQL "8120" -La colonna 'PRESENZE.dbo.TTMI.TTMI_DATE' non è valida nell'elenco di selezione perché non è inclusa né in una funzione di aggregazione né nella clausola GROUP BY.

....E quindi non mi genera la tabella
 

Alex@1983

Utente Attivo
9 Mag 2015
126
2
18
Questa prova a cambiarla cosi:
PHP:
$sql1 = mysqli_query($conn, "SELECT DISTINCT data FROM tabella");
Ciao Tommy...e grazie !!!

Ok ....martedì ci provo....domani non riesco !!!! ....:-(


Ma cosa devo fare esattamente ?

Solo select distinct data from tabella ?

Scusa...abbi pazienza con me.....io sono molto volenteroso.....ma MOOOLTO autodidatta.....
 

Tommy03

Utente Attivo
6 Giu 2018
616
58
28
20
Vicenza
Ma cosa devo fare esattamente ?
copiare il codice sostituendo i nomi di campi e tabelle, e aggiungi <table> e </table> prima dell'inizio e dopo la fine di tutto il codice php.
In pratica la prima select prende le date presenti nel database (nel tuo esempio 2020-08-09 e 2020-08-10), poi per ognuna di esse si crea una riga di una tabella (con <tr>) e una cella con la data (<td>$data</td>). Poi la seconda select, invece, seleziona tutti gli orari che nel database sono associati a quella data e per ognuno di essi crea una cela da affiancare a quella della data (<td>$orario</td>).

Comunque, in teoria con questo codice si dovrebbe visualizzare la tabella, ma con spazi vuoti (senza celle) nelle righe con meno orari, quindi, come nel tuo esempio, se 2020-08-09 ha 4 orari e 2020-08-10 ne ha 2, si crea una tabella con 5 celle nella prima riga (2020-08-09 + i 4 orari) e 3 nella seconda, se vuoi aggiungere automaticamente N celle in modo da avere lo stesso numero di celle in tutte le righe, dovresti cambiare il codice cosi:
PHP:
$sql = mysqli_query($conn, "SELECT COUNT(orario) AS numero FROM tabella GROUP BY data ORDER BY COUNT(orario) DESC LIMIT 1");
while($r = mysqli_fetch_assoc($sql)){
$num_max = $r['numero'];
}
$sql1 = mysqli_query($conn, "SELECT * FROM tabella GROUP BY data");
while($row1 = mysqli_fetch_assoc($sql1)){
$data = $row1['data'];
echo "<tr><td>$data</td>";
$sql2 = mysqli_query($conn, "SELECT * FROM tabella WHERE data='$data'");
while($row2 = mysqli_fetch_assoc($sql2)){
$orario = $row2['orario'];
echo "<td>$orario</td>";
}
$sql3 = mysqli_query($conn, "SELECT COUNT(orario) AS x FROM tabella WHERE data='$data'");
while($row3 = mysqli_fetch_assoc($sql3)){
$x = $row3['x'];
}
for($i=0;$i<($num_max - $x); $i++){
echo "<td></td>";
}
echo "</tr>";
}
non l'ho testato ma dovrebbe funzionare
 

Alex@1983

Utente Attivo
9 Mag 2015
126
2
18
copiare il codice sostituendo i nomi di campi e tabelle, e aggiungi <table> e </table> prima dell'inizio e dopo la fine di tutto il codice php.
In pratica la prima select prende le date presenti nel database (nel tuo esempio 2020-08-09 e 2020-08-10), poi per ognuna di esse si crea una riga di una tabella (con <tr>) e una cella con la data (<td>$data</td>). Poi la seconda select, invece, seleziona tutti gli orari che nel database sono associati a quella data e per ognuno di essi crea una cela da affiancare a quella della data (<td>$orario</td>).

Comunque, in teoria con questo codice si dovrebbe visualizzare la tabella, ma con spazi vuoti (senza celle) nelle righe con meno orari, quindi, come nel tuo esempio, se 2020-08-09 ha 4 orari e 2020-08-10 ne ha 2, si crea una tabella con 5 celle nella prima riga (2020-08-09 + i 4 orari) e 3 nella seconda, se vuoi aggiungere automaticamente N celle in modo da avere lo stesso numero di celle in tutte le righe, dovresti cambiare il codice cosi:
PHP:
$sql = mysqli_query($conn, "SELECT COUNT(orario) AS numero FROM tabella GROUP BY data ORDER BY COUNT(orario) DESC LIMIT 1");
while($r = mysqli_fetch_assoc($sql)){
$num_max = $r['numero'];
}
$sql1 = mysqli_query($conn, "SELECT * FROM tabella GROUP BY data");
while($row1 = mysqli_fetch_assoc($sql1)){
$data = $row1['data'];
echo "<tr><td>$data</td>";
$sql2 = mysqli_query($conn, "SELECT * FROM tabella WHERE data='$data'");
while($row2 = mysqli_fetch_assoc($sql2)){
$orario = $row2['orario'];
echo "<td>$orario</td>";
}
$sql3 = mysqli_query($conn, "SELECT COUNT(orario) AS x FROM tabella WHERE data='$data'");
while($row3 = mysqli_fetch_assoc($sql3)){
$x = $row3['x'];
}
for($i=0;$i<($num_max - $x); $i++){
echo "<td></td>";
}
echo "</tr>";
}
non l'ho testato ma dovrebbe funzionare
Ok !!!..... Grazie !!!!...

Domani provo e ti faccio sapere !!!!!
 

Alex@1983

Utente Attivo
9 Mag 2015
126
2
18
Ciao Tommy03,

visto che sei stato così gentile nel darmi una mano volevo provare a chiederti un'altra cosa ..... che poi sarebbe la tappa finale del mio progettino:

ora che tutto è fatto e gli orari sono correttamente visualizzati su una sola riga, vorrei aggiungere una cella finale sulla stessa riga riportante il numero totale di ore lavorate ( ovvero la somma della prima e della quarta cella meno la somma della seconda e della terza)

Il problema però nasce dal fatto che nel DB dove estraggo i dati (e che non posso modificare) gli orari sono salvati in campi di tipo char(6) .... non chiedermi con che criterio perchè sono il primo a non capirlo ...

Io ho fatto diverse prove .....

ma l'unica che ha portato ad un risultato con una parvenza di senso è stata :
SQL:
"SELECT SUM(CAST (TTMI_TIME AS int )) FROM .dbo.TTMI where TTMI_DATA = '$data'";

che in realtà non mi porta da nessuna parte perchè nel caso della prima riga della tabella sopra esposta mi restituisce :
08+14+17+22 per le ore e 22+33+40+10 per i minuti .... quindi : 61105 .... che non vuol dire prprio nulla !!!!.....

2020-08-090822143317402210

Come potrei fare ?......

grazie mille
 

Tommy03

Utente Attivo
6 Giu 2018
616
58
28
20
Vicenza
Riprendo il codice che avevo utilizzato, prova in questo modo:
Da cosi:
PHP:
$sql1 = mysqli_query($conn, "SELECT * FROM tabella GROUP BY data");
while($row1 = mysqli_fetch_assoc($sql1)){
$data = $row1['data'];
echo "<tr><td>$data</td>";
$sql2 = mysqli_query($conn, "SELECT * FROM tabella WHERE data='$data'");
while($row2 = mysqli_fetch_assoc($sql2)){
$orario = $row2['orario'];
echo "<td>$orario</td>";
}
echo "</tr>";
}
A cosi:
PHP:
function minutes($numero){
$hours = substr($numero, 0, -2);
$minutes = substr($numero, -2);
$tot = $hours * 60 + $minutes;
return $tot;
}

$sql1 = mysqli_query($conn, "SELECT * FROM tabella GROUP BY data");
while($row1 = mysqli_fetch_assoc($sql1)){
$data = $row1['data'];
echo "<tr><td>$data</td>";
$a = array();
$sql2 = mysqli_query($conn, "SELECT * FROM tabella WHERE data='$data'");
while($row2 = mysqli_fetch_assoc($sql2)){
$orario = $row2['orario'];
array_push($a, minutes(ltrim("$orario","0")));
echo "<td>$orario</td>";
}
$sum_entrate = array_sum(array_slice($a, 0, 3)) - array_slice($a, 1, 1)[0];
$sum_uscite = array_sum($a) - $sum_entrate;
$tot_ore = floor(($sum_uscite - $sum_entrate)/60);
$tot_min = ($sum_uscite - $sum_entrate) % 60;
echo "<td>$tot_ore:$tot_min</td>";
echo "</tr>";
}
 

Tommy03

Utente Attivo
6 Giu 2018
616
58
28
20
Vicenza
Avevo dimenticato di aggiungere che questo codice funziona solo se ci sono 4 orari... E' così oppure ce ne possono essere anche da 6,8,...?
 

Alex@1983

Utente Attivo
9 Mag 2015
126
2
18
Ciao Tommy03......

È tutto perfetto !!!... Grazie !!!

E funziona bene anche quando ci sono solo 2 orari .....

Ho solo dovuto modificare il codice da :
PHP:
$sum_entrate = array_sum(array_slice($a, 0, 3)) - array_slice($a, 1, 1)[0]

In
PHP:
$sum_entrate = array_sum(array_slice($a, 1, 4)) - array_slice($a, 2, 3)[0]

Perché funzionasse bene.. ma la cosa mi è molto servita per comprendere bene il criterio del codice stesso......


Cmq rispondendo alla tua domanda .... Avrò sempre max 4 orari ....ma ho visto che funzia anche quando cene sono solo 2...... :-;


Grazie mille !!!!

Sei sempre gentilissimo !!!!

Buona serata
 
Discussioni simili
Autore Titolo Forum Risposte Data
G Raggruppare record tabella PHP 1
S Raggruppare ed estrarre data più recente MySQL 6
R Raggruppare valori array PHP 5
max1974 raggruppare e girare i dati in colonne MySQL 11
max1974 [PHP] Raggruppare array PHP 4
MarcoGrazia [mysql][mariadb]Raggruppare query in base alla data MySQL 2
M [PHP] [HTML] Raggruppare 4 pagine web in una PHP 3
D Raggruppare dati query con php PHP 1
A Raggruppare piu' funzioni in una sola PHP 1
N Raggruppare risultati di due tabelle PHP 1
ivarello Raggruppare Query per mese PHP 1
mircop Raggruppare elementi di una tabella PHP 2
davide1982 Raggruppare dati in categorie con group by MySQL 2
M Raggruppare dati in array per successivo insert PHP 6
X Raggruppare risultati di una query PHP 3
T come ordinare dei record recuperati da due tabelle MySQL 0
T vista record tabellare MySQL 0
K form Inserimento record mysql PHP 2
R query DELETE non cancella i record PHP 1
M Accodare record presi da un altra tabella PHP 8
MarcoGrazia Trovare record nel database partendo da id non sequenziali PHP 6
G notifiche dekstop/mobile ogni volta che record è inserito/eliminato/aggiornato PHP 0
P Pagina modifica record che non funziona PHP 0
S Selezionare ultimo record di una sotto query MySQL 27
A Tabella con bottoni per aggiornamento record PHP 6
S Differenza date record successivi MS Access 7
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
S Aggiornamento lista record Database 2
M Esportazione in CSV, salta il primo record PHP 4
T foreach e fetchAll dove recupero solo l'ultimo record PHP 5
R Scorporare array e recuperare record tabella PHP 10
Tommy03 Select in ordine per numero di record MySQL 7
L Creazione di 2 o più record PHP 6
mazman mysqli_query() mi ritorna un array vuoto anche se presente un record nella tabella PHP 13
L contare record uguali in file csv PHP 4
M Estrapolare singoli record da intervallo (dal al/inizio fine) MS Access 0
max1974 [MySQL] Estrapolare record finti/inisistenti MySQL 9
G [PHP] Passare dati tra record PHP 4
G Cambiare colore ad un record database mysql MySQL 0
S elimina record sql asp classic Classic ASP 5
S [MS Access] Apertura Maschera su nuov record in base a determinato ID MS Access 0
M leggere con jquery/ajax in una function javascript record di database sql server Javascript 0
P [PHP] Stampare record di diverse tabelle ma con nomi uguali PHP 6
M [PHP] Selezione record da elenco PHP 24
A [MS Access] Aprire maschera con sottomaschera su ultimo record MS Access 0
C [PHP] Creare un Pulsante che ricopia valori di un campo in altro record PHP 4
C [MySQL] Copiare campi di un record in un nuovo record MySQL 0
O [PHP] Ricerca record tramite post PHP 7
GraceHawk [MS Access] Findfirst per ricerca record MS Access 1
C [PHP] scrivere o aggiornare record in tabella PHP 7

Discussioni simili