Raggruppare record con stessa data

[email protected]

Utente Attivo
9 Mag 2015
120
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
490
49
28
17
Bassano del Grappa (VI)
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>";
}
 

[email protected]

Utente Attivo
9 Mag 2015
120
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
 

[email protected]

Utente Attivo
9 Mag 2015
120
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
490
49
28
17
Bassano del Grappa (VI)
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
 

[email protected]

Utente Attivo
9 Mag 2015
120
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 !!!!!
 

[email protected]

Utente Attivo
9 Mag 2015
120
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
490
49
28
17
Bassano del Grappa (VI)
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>";
}
 

[email protected]

Utente Attivo
9 Mag 2015
120
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