Статья актуальна до версии 2022.1.
В FastReport.NET есть прекрасный инструмент для вывода данных в виде сводной таблицы, или матрицы. Многим бы хотелось расширить функциональность матриц, например, такой полезной опцией, как выбор топ N значений. Казалось бы, что проще, чем выбрать первые N строк из источника данных. Но помимо выборки из топ значений, нужно сгруппировать все остальные данные в одну запись и в этом заключается главная сложность. Штатными средствами объекта Matrix это сделать невозможно.
Поэтому нам нужно подготовить данные так, чтобы в них были, и топ значений, и сумма по всем остальным значениям. Этот способ подходит для SQL баз данных. Всё что нам нужно — написать SQL запрос.
Допустим мы выводим список зарплат сотрудников по годам. В редакторе источника данных вы можете использовать SQL запрос, если используется SQL база данных.
Вот как будет выглядеть SQL запрос, который выберет нам топ 2 значения и сумму по остальным:
SELECT top 2 name, year, month, salary FROM crosstest ORDER BY salary UNION SELECT 'Other' AS name, year, month, SUM(salary) FROM crosstest WHERE name NOT IN (SELECT Top 2 name FROM crosstest ORDER BY salary) GROUP BY name, year, month
Здесь мы объединили два запроса с помощью оператора union. В первом запросе выбираем топ значений, а во втором — сумму всех остальных значений.
В итоге получаем вот такую матрицу:
Как видите, применяя различные приемы подготовки исходных данных, мы можем добиться желаемого эффекта, даже если такая функциональность не предусмотрена в генераторе отчетов изначально.