Generalization : CrossTensorate
A generalization of CrossTabulate is the function CrossTensorate implemented in [1] that takes a "formula" argument similar to R's xtabs.
This finds number of people of different sub-groups of Titanic data:
ctRes = CrossTensorate[Count == "passenger survival" + "passenger sex" + "passenger class", titanicData, aTitanicColumnNames];
MatrixForm[ctRes]

We can verify the result using Count:
Count[titanicData, {"1st", _, "female", "died"}]
(* 5 *)
Count[titanicData, {"2nd", _, "male", "survived"}]
(* 23 *)
To split the cross-tensor across its first variable we can use this command:
sctRes = Association@
MapThread[Rule[#1, Join[<|"XTABTensor" -> #2|>, Rest@Rest@ctRes]] &, {ctRes[[2]], # & /@ ctRes["XTABTensor"]}];
MatrixForm /@ sctRes

Or we can call the more general function CrossTensorateSplit implemented in [1]:
Map[MatrixForm /@ CrossTensorateSplit[ctRes, #] &, Rest@Keys[ctRes]]
CrossTensorateSplit can also be called with one argument that is a variable name.This will produce a splitting function. For example, the above command can be re-written as :
Map[MatrixForm /@ CrossTensorateSplit[#] @ ctRes &, Rest@Keys[ctRes]]