From your data, I think what you're really dealing with is a overlapping intervals problem. You have overlapping intervals (student start and end dates) and you need a running count based on the intervals.
Try this solution, which only gives dates where the running total changes. If you need all dates, you can use a calendar table in conjunction with this solution. If you do, note that the order gets a bit tricky.
, SUM(de.enroll_status) AS daily_total
, SUM(SUM(de.enroll_status)) OVER(ORDER BY de.enroll_status_dt ROWS UNBOUNDED PRECEDING) AS running_total
FROM #enrollments AS e
CROSS APPLY ( VALUES(1, e.start_date), (-1, COALESCE(e.end_date, '9999-12-31'))) de(enroll_status, enroll_status_dt)
GROUP BY de.enroll_status_dt
ORDER BY de.enroll_status_dt;
Also, when working with open or half-open intervals, it is best to use arbitrary end points for the unknown values rather than using a NULL value. I tend to use 1900-01-01 as an arbitrary start value and 9999-12-30 (or 9999-12-31 or 9999-01-01) as an arbitrary end value unless the data could realistically fall outside of that range.
J. Drew Allen
Business Intelligence Analyst