Я не думаю, что вы можете делать то, что вы хотите, используя «простое» выражение select (даже используя GROUPing и т. Д.). Это не в моей голове, поэтому вам придется немного поэкспериментировать с и желательно прочитать превосходную книгу SQL для умников Джо Селко .
Вам необходимо создать вторую таблицу, содержащую все ваши месяцы (даты начала / окончания). Вам нужна только одна таблица для всех типов похожих запросов, и она должна содержать все месяцы в диапазонах дат, которые вы интересуетесь запросами:
CREATE TABLE months (id, start DATE, end DATE);
INSERT INTO months (id, start, end)
values ( (1, 2011-01-01, 2011-01-31),
(2, 2011-02-01, 2011-02-28), ...);
Затем вы ВНЕШНИЙ ВНЕШНИЙ ВХОД со своей таблицы пользователей на эту таблицу месяцев. Это даст вам строку для каждого пользователя за каждый месяц, в течение которого он был доступен, и вы можете при необходимости ГРУППАТЬ:
SELECT months.id, COUNT(user.id)
FROM months LEFT OUTER JOIN users
ON user.start_date < months.end
AND user.end_date > months.start
GROUP BY months.id;
Надеюсь, это поможет.