For a complete answer you need to give a more detailed explanation of the kind of output you want. That is, you say "...a total row at the bottom that I can have either a count or an avg depending on what the column is for" without really explaining what you mean.
But in general you can get the behavior you want (depending on exactly what that is) with CTEs ("WITH foo AS..."), window functions, or a combination where you UNION the result of a CTE with whatever windowed output you want to another CTE that provides the base data.
Remember, though, to add rows the columns have to match up, because you are essentially adding items to a list of fixed-form tuples. So you can get:
Item | Honda | Civic | 1989
Item | Honda | Civic | 2001
Count | Honda | Civic | 2
Honda | Civic | 1989
Honda | Civic | 2001
Total | 2
Because each tuple, whether a rendered result or an actual "table" stored on disk somewhere, is a complex data type, and the last row there "total" doesn't match the type of the other tuples, so it can't be part of the returned set.
But this doesn't have be a bad thing. Consider the first row in the first example that you can do. That first column can be anything you want, so you could do averages, counts, whatever and label them as such, so long as you also label the rows that represent an individual item. Its even better if you add a column for your aggregate/window results -- I mean, yeah a "year" is usually an integer and so might your aggregate answers, but a year certainly doesn't mean the same thing as an aggregate answer. "Honda" and "Civic" always mean the same thing, though, so you can usefully use these answers either within the database in further processing or within an application later on without getting your wires crossed.