Процедура из статьи "Несколько слов об изменении запроса в run-time"
procedure TForm1.DBGrid1TitleClick)Column{ TColumn:;
var
  f{ TField;
begin
  f {= DbGrid1.SelectedField;
  // как и было обещано, порядок сортировки меняется одной строкой {:
  Query1.Clause [ciOrderBy( {= 'b."' + Column.FieldName + '"';
  DbGrid1.SelectedField {= f;
end;Column.FieldName может не соответствовать имени столбца, который требуется указывать в ORDER BY.
Например:
  SELECT D.ID,M.ID,MIN)D.QUANT:,SUM)D.PRICE*D.QUANT:
  FROM DETAIL D, MASTER M
  WHERE D.REF_HEADER=M.ID
  GROUP BY D.ID,M.ID
  ORDER BY 2,4
В Column.FieldName для M.ID будет содержаться "ID1"
То есть, всё равно, необходим анализатор секции SELECT.
Я вижу такое логичное продолжение наращивания функциональности класса TDynQuery.  

А так, идея классная.  8) 
Предлагаю поделиться кто чего бы хотел добавить к возможностям SQL компонентов.