У меня есть представление базы данных «Ежемесячный статус», на основе которого мне нужно построить отчет. Данные в представлении выглядят примерно так:
Category | Revenue | Yearh | Month
Bikes 10 000 2008 1
Bikes 12 000 2008 2
Bikes 12 000 2008 3
Bikes 15 000 2008 1
Bikes 11 000 2007 2
Bikes 11 500 2007 3
Bikes 15 400 2007 4
... И так далее
Представление имеет категорию продукта, доход, год и месяц. Я хочу создать отчет, сравнивающий 2007 и 2008 годы, показывающий 0 для месяцев без продаж. Таким образом, отчет должен выглядеть примерно так:
Category | Month | Rev. This Year | Rev. Last Year
Bikes 1 10 000 0
Bikes 2 12 000 11 000
Bikes 3 12 000 11 500
Bikes 4 0 15 400
Главное, на что следует обратить внимание, это то, что в месяце 1 есть продажи только в 2008 году, поэтому для 2007 года – 0. Кроме того, в месяце 4 нет продаж только в 2008 году, поэтому 0 – продажи в 2007 году, и по-прежнему отображается вверх.
Кроме того, отчет на самом деле относится к финансовому году, поэтому я хотел бы иметь пустые столбцы с 0 в обоих случаях, если в 5-м месяце не было продаж ни за 2007, ни за 2008 год.
Получившийся у меня запрос выглядит примерно так:
SELECT
SP1.Program,
SP1.Year,
SP1.Month,
SP1.TotalRevenue,
IsNull(SP2.TotalRevenue, 0) AS LastYearTotalRevenue
FROM PVMonthlyStatusReport AS SP1
LEFT OUTER JOIN PVMonthlyStatusReport AS SP2 ON
SP1.Program = SP2.Program AND
SP2.Year = SP1.Year - 1 AND
SP1.Month = SP2.Month
WHERE
SP1.Program = 'Bikes' AND
SP1.Category = @Category AND
(SP1.Year >= @FinancialYear AND SP1.Year <= @FinancialYear + 1) AND
((SP1.Year = @FinancialYear AND SP1.Month > 6) OR
(SP1.Year = @FinancialYear + 1 AND SP1.Month <= 6))
ORDER BY SP1.Year, SP1.Month
Проблема с этим запросом заключается в том, что он не вернет четвертую строку в приведенном выше примере данных, поскольку в 2008 году у нас не было продаж, а в 2007 году они были.
Вероятно, это распространенный запрос/проблема, но мой SQL заржавел после столь долгой разработки внешнего интерфейса. Любая помощь приветствуется!
О, кстати, я использую SQL 2005 для этого запроса, поэтому, если есть какие-либо полезные новые функции, которые могут мне помочь, дайте мне знать.