Чтобы упростить свой пример, если у вас есть таблица T, которая содержит :
Type | Month | Year
-------+-------+-------
ADD | 1 | 2013
ADD | 1 | 2013
REMOVE | 1 | 2013
REMOVE | 1 | 2013
ADD | 2 | 2013
ADD | 2 | 2013
REMOVE | 3 | 2013
Как вы уже заметили, если вы:
SELECT Type, Month, Year, COUNT(*) AS Count
FROM T
GROUP BY Type, Month, Year;
Вы получите:
Type | Month | Year | Count
-------+-------+------+-------
ADD | 1 | 2013 | 2
REMOVE | 1 | 2013 | 2
ADD | 2 | 2013 | 2
REMOVE | 3 | 2013 | 1
Таким образом, вы пропускаете рассчитывает на СДВ за месяц 3 и REMOVE за месяц 2. Это происходит потому, что база данных не может включать в себя результаты, которые не существуют.
Как решить это зависит от того, как именно вы хотите, чтобы ваши результаты, чтобы показать, если вы хотите, чтобы все возможные комбинации, вам нужно будет использовать что-то вроде:
SELECT Types.Type, Years.Year, Months.Month
FROM (SELECT DISTINCT Type FROM T) AS Types
CROSS JOIN (SELECT DISTINCT Year FROM T) AS Years
CROSS JOIN (SELECT DISTINCT Month FROM T) AS Months
Это даст cartesion произведение всех 3 колонки:
Type | Month | Year
-------+-------+-------
ADD | 1 | 2013
ADD | 2 | 2013
ADD | 3 | 2013
REMOVE | 1 | 2013
REMOVE | 2 | 2013
REMOVE | 3 | 2013
Вы можете LEFT JOIN исходную таблицу, чтобы получить отсчеты:
SELECT Types.Type, Years.Year, Months.Month, COUNT(T.Type) AS Count
FROM (SELECT DISTINCT Type FROM T) AS Types
CROSS JOIN (SELECT DISTINCT Year FROM T) AS Years
CROSS JOIN (SELECT DISTINCT Month FROM T) AS Months
LEFT JOIN T
ON T.Type = Types.Type
AND T.Year = Years.Year
AND T.Month = Months.Month;
который даст желаемый результат:
Type | Month | Year | Count
-------+-------+------+--------
ADD | 1 | 2013 | 2
ADD | 2 | 2013 | 2
ADD | 3 | 2013 | 0
REMOVE | 1 | 2013 | 2
REMOVE | 2 | 2013 | 0
REMOVE | 3 | 2013 | 1
Я попытался сделать выше в качестве СУБД inspecific, насколько это возможно, так как никто не был поставлен в вопросе, но это может потребовать незначительных настроек для вашей СУБД.
Я думаю, для этого вам нужно поставить код проверки – Freak
Я не так хорош с sql - вы можете предложить запрос с проверкой? –
Это потому, что наличие count 0 означает, что у вас нет строк на таблице, содержащей эти значения. Вы не можете иметь строки результата, которых нет в таблице. Говорить по-другому. Как должна знать база данных о том, что вы хотите получить результат [УДАЛИТЬ, 1, 2013, 0]? Как он должен знать, что вы не хотите видеть результат [FOOBAR, -7, 1353, 0]? Эта комбинация также имеет нулевой счет на столе. – OllesEtta