diff --git a/src/main/java/io/ventureplatform/util/InvestmentRollup.java b/src/main/java/io/ventureplatform/util/InvestmentRollup.java
new file mode 100644
index 0000000..201a281
--- /dev/null
+++ b/src/main/java/io/ventureplatform/util/InvestmentRollup.java
@@ -0,0 +1,91 @@
+package io.ventureplatform.util;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Aggregates investment data across portfolio companies for dashboard rollups.
+ *
+ *
Used by reporting endpoints to compute category-level totals and rankings
+ * without round-tripping to the database for every aggregation.
+ */
+public final class InvestmentRollup {
+
+ private InvestmentRollup() {
+ // utility class
+ }
+
+ /**
+ * A parameterized SQL clause with placeholder markers and
+ * the corresponding bind values.
+ *
+ * @param clause the SQL fragment, e.g. {@code category IN (?, ?)}
+ * @param params the values to bind to the placeholders
+ */
+ public record CategoryFilter(String clause, List params) { }
+
+ /**
+ * Sum the total investment amount for portfolio companies matching the
+ * given category. Returns 0 if no matches.
+ *
+ * @param companies portfolio company records, each a map with
+ * "category" and "amount" keys
+ * @param category category to filter on
+ */
+ public static long totalInvestmentByCategory(
+ final List