What the query filter object does is build a SQL query using the property values you give it. It looks something like this:
SELECT <subfields> FROM <tablename> WHERE <whereclause>
It doesn't parse the property values you give it - it simply puts them into the query. Different data sources implement different flavors of SQL. What works in one may or may not work in another. The Subfields property is intended to be a simple list of field names. The fact that you can also add keywords such DISTINCT is simply a byproduct of how the object creates the SQL queries. Because it is not an intended use of the property, you should not include anything but field names in the list unless you can guarantee that your query will always execute against a data source that supports the keywords you are inserting. If you need to perform queries that do more than what the query filter object supports then you shouldn't use it. Instead, you can connect to the data source directly and execute the required queries (this is a non-ArcObjects approach). You can also use ArcObjects classes, such as IDataStatistics and IQueryFilterDefinition, that are specifically written for additional query support. There is also the IWorkspace.ExecuteSQL method which may be of some use in certain cases. ISqlSyntax may also be used to build queries for specific data sources. Hope this helps.