У меня есть представление базы данных «Статус за месяц», на котором мне нужно построить отчет. Данные в представлении выглядят примерно так:
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 году, и, следовательно, 0 в 2007 году. Кроме того, в 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 для этого запроса, поэтому, если есть какие-либо полезные новые функции, которые могут помочь мне, дайте мне знать.