Your suggested approach ("normalize & duplicate records") --
it is called Pivot when using Tableau with an Excel / Text datasource --
is a good one indeed. One should worry less about duplicates -- as soon as
the dataset is used for this particular view (by Category or Dep) only.
A possible alternative would be making a list of all Categories --
as a distinct "Scaffold" datasource -- and blending the original DS
three times to the Scaffold one (by Category 1, 2 and 3, respectively).
This looks more complicated imho.
Another method if you're game, is to use custom SQL to connect to your source data and use a union to stack the data on top of each other to make a set of common columns. Take a look at another example i've discussed here - Re: Is it possible to use the Rows as the dimensions/measures instead of the Columns from the data source?