Grouping by date only returns dates that have rows. A day with no orders simply isn't there, and a chart or an average over days quietly skips it. The fix is a date spine: every date in the range, generated first, with the data joined on.
SELECT CAST(g.d AS DATE) AS day, COUNT(o.order_id) AS orders
FROM generate_series(DATE '2025-03-01', DATE '2025-03-31', INTERVAL 1 DAY) AS g(d)
LEFT JOIN orders AS o ON o.order_date = CAST(g.d AS DATE)
GROUP BY 1
ORDER BY 1;
generate_series (PostgreSQL, DuckDB) returns timestamps here, so cast them to DATE. Count a column from the joined table, not *, so empty days count 0. Snowflake uses GENERATOR, BigQuery GENERATE_DATE_ARRAY, and SQL Server a recursive CTE or a permanent calendar table; many teams keep a calendar table for exactly this.