TBody CSS scrolling doesn't work for most browsers. So you are stuck with two options I can see (at least till the next gen of css support)
1) dupe the table or 2) dupe the header.
1) Draw the table twice with the same data
In the top table display:none the tbody. the hidden tbody will still be taken into account when assigning col widths. So now your col widths will match up with the bottom table.
Wrap the second bottom table in a div, use that to scroll the table inside. display:none the thead of this table.
Now between the two tables you have a header and data. This will double the html required to display your table so this isn't a good solution with a large dataset.
2) Draw the header above the table
Set the table inside a scrolling div. Use css/javascript to find the size of each column, and then set the column widths of the floating header table by hand. This required the page to finish rendering until it will work, so there will be a jerky resize after the page loads. The duped floating header could even just be a bunch of div elements or a ul really.
If can come up with a different/better solution please share.