Before trusting any joined aggregate, interrogate the grain: count rows, count distinct keys of the side you're about to sum. Equal → the join preserved grain; unequal → the many side multiplied you, and every parent-level SUM downstream is inflated by exactly that ratio. The same probe works preventively (before writing the aggregate) and forensically (the revenue looks high — check the counts first).
SELECT SUM(g.kilos) AS kilos FROM grow g JOIN harvest h ON h.batch = g.batch;
SELECT SUM(kilos) AS kilos FROM grow;
The joined SUM read 40 kilos, not 30 — batch B1 had two harvest rows, so the join multiplied it; COUNT(*) was 3 where COUNT(DISTINCT batch) was 2, and that gap is the inflation.
The two-count probe, plus GROUP BY pk HAVING COUNT(*) > 1 to see the multipliers.