Okis, le agregaré comentarios a cada parte :)
Código PHP:
<table>
<!-- Fila de Encabezado de tu Tabla -->
<tr>
<td>TIPO</td>
<td>NOMBRE</td>
<td>PLAN
<!-- Dejo abierta la ultima celda, pues la cerraremos cuando inicie el ciclo WHILE-->
<?
// realiza consulta en la base de datos
$sql = mysql_query("tu consultota");
// esta variable guardará el TIPO del ultimo registro leído en el ciclo WHILE
$ult_tipo = false;
// recorre el resultado de la consulta.
// lo va recorriendo registro por registro (fila).
// cada "fila" contiene tantas "columnas" como campos tenia tu consulta.
// o sea, $fila es en verdad un arreglo unidimensional.
while ($fila = mysql_fetch_array($sql))
{
// si el TIPO es distinto al TIPO del registro anterior,
// inicias una nueva fila HTML donde escribirás los datos
// principales (Tipo, Nombre, 1º Plan)
if ($ult_tipo != $fila["tipo"])
{
// aqui debes cerrar la ultima celda abierta de la fila anterior.
// en el caso de ser la primera fila, deja la fila del encabezado abierta para que
// al ejecutarse esto, cuadren las celdas.
?>
</td>
</tr>
<tr>
<td><?= $fila["tipo"]; ?></td>
<td><?= $fila["nombre"]; ?></td>
<td><?= $fila["plan"]; ?>
<?
}
else
{
// aqui imprimes un nuevo plan en la misma celda anterior,
// sin agregar todo lo otro:
print $fila["plan"]." <br>\n";
}
// guardas en memoria el TIPO del registro ACTUAL
$ult_tipo = $fila["tipo"];
} //fin while
?>
<!-- Cerramos la celda que quedó abierta con el último registro.
Con ello se cierra tambien la tabla -->
</td>
</tr>
</table>
Si falta más explicacion me lo cuentas.
Por cierto, en este código yo no capturé errores, o si encuentra o no registros, ni nada por el estilo, eso queda a cuenta tuya ;)