There are a lot of table sorting plugin available for jQuery if you need to handle it in the front then. If you want to do it in the front end with PHP the best way is to create a function that either checks for a URL variable or uses the action/id method and returns the dataobject. You can then have the table heading either call this function or reload the page with the correct URL variable.
I do something like this on Products that have multiple colors
function showColor(){
if(isset($_GET['color'])){
$colorSelect = $_GET['color'];
return DataObject::get("Color", "StripedColorName='".$colorSelect."' AND ColorProductID = ".$this->ID);
}
else {
return false;
}
}
The colo links on the page just reload the page with ?color=pink tacked on the end. Then in my template I just do a check against showColor and if its there I use a showColor control to render the data. In you case it would even be easier since it the same data just in a different order.
Silverstripe will needs to let you call the Sort() function form the template as it does for GroupBy().