SQL - tabla pivot o programacion php para tabla con columnas entre rangos de fecha

 
Vista:
sin imagen de perfil

tabla pivot o programacion php para tabla con columnas entre rangos de fecha

Publicado por valentina (1 intervención) el 31/03/2023 21:41:52
hola, tengo 3 tabla
tabla usuario

id Rut
Seudonimo

tabla estado
Id Estado
EstadoP

Tabla Asistencia
Id Asis
Id Rut
Id Estado
Fecha

armando una tabla normal quedaria

Rut | Nombre | Estado | Fecha
----+-------- +---------- +------
A | FRAN | Activo | 1
B | lUIS | ausente | 1
C | jORGE | Vacacion | 1
A | FRAN | Activo | 2
B | lUIS | Activo | 2
C | jORGE | Vacacion | 2


Y lo que necesito conseguir es:

Rut | Nombre | 1 | 2
----+-------- +---------- +-------
A | FRAN | Activo | Activo
B | LUIS | Ausente | Activo
C | JORGE | Vacacion | Activo

Espero alguien me pueda ayudar, comparto la tabla Pivot, pero está repite los nombres hacia abajo y no puedo hacer group by:

SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'(CASE WHEN Asistencia.Fecha = ''', Asistencia.Fecha,''' THEN estado_usuario.EstadoP END) AS `',
Asistencia.Fecha, '`'
)
) INTO @sql
from Asistencia
left join estado_usuario
on Asistencia.Id_Estado = estado_usuario.Id_Estado
left join usuario
on Asistencia.Rut = usuario.Rut
WHERE Asistencia.Fecha BETWEEN '2023-03-02' AND '2023-03-04';

SET @sql = CONCAT('SELECT DISTINCT usuario.Rut,
usuario.Seudonimo, ', @sql, '
from Asistencia
left join usuario on Asistencia.Rut = usuario.Rut
left join estado_usuario on Asistencia.Id_Estado = estado_usuario.Id_Estado');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


otra opcion que intente fue realizarlo por php, pero consigo lo que necesito si es que defino un rut, pero necesito la tabla con todos los rut, quizas con un for o foreach, dejo el php como queda seleccionando un rut.

$Rut=$_POST['Rut'];
$Fecha1=$_POST['Fecha1'];
$Fecha2=$_POST['Fecha2'];

$sqli="SELECT Asistencia.Rut, usuario.Seudonimo, Asistencia.Fecha,
estado_usuario.EstadoP
FROM Asistencia
LEFT JOIN estado_usuario ON Asistencia.Id_Estado
=estado_usuario.Id_Estado
LEFT JOIN usuario ON Asistencia.Rut = usuario.Rut
WHERE Asistencia.Rut='$Rut' AND Asistencia.Fecha BETWEEN '$Fecha1'
AND
'$Fecha2' ";

echo '<table border=1>';
echo '<tr><th>Rut</th><th>Nombre</th>';

$fecha = array();
$estado = array();
while ($fila = mysqli_fetch_array($query)) {
$fecha[] = $fila['Fecha'];
$estado[] = $fila['EstadoP'];
$Rut = $fila['Rut'];
$Nombre = $fila['Seudonimo'];
}
foreach($fecha as $fec) {
echo '<th>' . $fec . '</th>';
}
echo '</tr>';
echo '<tr>';

echo '<td>' . $Rut. '</td>';
echo '<td>' . $Nombre. '</td>';

foreach($estado as $est) {
echo '<td>' . $est . '</td>';
}

echo '</tr></table>';


Ayuda!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder