Это возможное решение. Он ограничен, поскольку он работает только в течение лета 2012 и 2013 годов и нуждается в изменении, если вы хотите включить дополнительные годы. Это также не очень элегантно, и я уверен, что некоторые из гуру SQL на этом сайте смогут его упростить.
SELECT NVL(SUM(DECODE(date_entered_year, '2012', 1, 0)), 0) year_2012,
NVL(SUM(DECODE(date_entered_year, '2013', 1, 0)), 0) year_2013
FROM (SELECT TO_CHAR(date_entered, 'YYYY-MM') date_entered_month,
TO_CHAR(date_entered, 'YYYY') date_entered_year
FROM cwwebapp_oti.dbo.v_cbi_All_Tickets
WHERE company_name IN ('Company, Inc.', 'Business LLC')
),
(SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2012-01','yyyy-mm'), rownum -1), 'YYYY-MM') year_month,
TO_CHAR(ADD_MONTHS(TO_DATE('2012-01','yyyy-mm'), rownum -1), 'MM') month
FROM cwwebapp_oti.dbo.v_cbi_All_Tickets
WHERE ROWNUM <= MONTHS_BETWEEN(TO_DATE('2013-12','yyyy-mm'),
TO_DATE('2012-01','yyyy-mm'))+1
) list_of_months
WHERE year_month = date_entered_month
GROUP BY month
ORDER BY month
The list_of_months подзапроса используется только для того чтобы получить список месяцев между январем 2012 года и декабрем 2013 г. Это может быть любой таблица, с единственным требованием в том, что она содержит стольких строк, в нем, как вам нужно месяцев. В этом случае мы предполагаем, что таблица имеет не менее 24 строк.
Также у меня есть фон Oracle, и похоже, что вы находитесь в среде SQL Server, поэтому вам нужно преобразовать функции Oracle в функции SQL. Надеюсь, это поможет.
ОБНОВЛЕНИЕ Я немного поработал на SQL Server и думаю, что следующий запрос должен работать. Опять же, я уверен, что кто-то, кто разбирается в SQL Server, сможет его упростить.
SELECT SUM(CASE date_entered_year
WHEN '2012' THEN 1
ELSE 0
END) year_2012,
SUM(CASE date_entered_year
WHEN '2013' THEN 1
ELSE 0
END) year_2013
FROM (SELECT CAST(DATEPART(year, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR)+'-'+
CAST(DATEPART(month, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR) y1,
CAST(DATEPART(month, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR) m1
FROM (SELECT row_number() OVER (ORDER BY id) as rn
FROM cwwebapp_oti.dbo.v_cbi_All_Tickets) sub1
WHERE rn <= DATEDIFF(mm, CONVERT(date, '20120101'),
CONVERT(date, '20131231'))+1
) list_of_months LEFT OUTER JOIN
(SELECT CAST(DATEPART(year, date_entered) AS VARCHAR)+'-'+
CAST(DATEPART(month, date_entered) AS VARCHAR) date_entered_month,
CAST(DATEPART(year, date_entered) AS VARCHAR) date_entered_year
FROM cwwebapp_oti.dbo.v_cbi_All_Tickets
WHERE company_name IN ('Company, Inc.', 'Business LLC')
) company_data ON list_of_months.y1 = company_data.date_entered_month
GROUP BY m1
ORDER BY m1
Я нахожусь в среде MS SQL server, и, если быть точным, я в Visual Studio 2012, используя построитель запросов, чтобы получить данные для объекта диаграммы. Я протестировал ваш код, конечно, он не будет работать с функциями Oracle, так что это не сработало НО! Я хочу сказать спасибо, поскольку он все же устанавливает почву для решения! Благодаря! – Coogrrr