Question:Does Reporting Services support horizontal tables (fixed rows and dynamic columns)?
Answer:There is no native "horizontal table" report item, but simple horizontal tables can be simulated using Matrix.
Step 1: Add a matrix to your report
Step 2: Add static rows to the matrixRight-click in the Data cell and select "Add Row". Repeat for the number of fixed rows you want.
Step 3: Drag fields into the Data cellsYou'll notice that the design tool automatically wraps your field reference in the "First" aggregate (e.g. =First(Fields!City.Value)). Since you're doing this in the context of a matrix, the design tool is ensuring that the expression is meaningful even in the context of a subtotal or if the matrix is showing aggregated data rather than detail data. Since you're going to show detail data without subtotals, you technically could remove the aggregate expression (but don't, since then you'll start getting warnings which you'll need to ignore).
Step 4: Add a column groupingRight-click on the column header and select "Edit Group". Enter this for the group expression: =RowNumber(Nothing). This will cause the matrix to give you one column per row of data. Since horizontal tables can end up rather wide, you probably want your table wrap around to the next "line" after a specific number of columns.
Step 5: Put the table into a listAdd a list to your report and drag the table into it
Step 6: Group by a number of rowsRight-click on the list and select Properties. Then click on Edit Details Group.Enter this for the group expression: =Ceiling(RowNumber(Nothing)/3)This will cause the list to group on every three rows. So you'll get a separate table for every three rows.
Step 7: Adjust the group expression in the matrixEdit the column group expression in your matrix and change the RowNumber argument to be the list group name.For example: =RowNumber("list1_Details_Group")
A full working sample of horizontal table is attached.