Это может показаться чем-то вроде вопроса «сделай домашнее задание для меня» (и это так), но я думаю, что результаты продаж, которые я пытаюсь получить, являются довольно общими и будут полезны для всех, кто занимается продажами отчетности.
У меня есть базовая таблица Sales (поля: Branch , DateOfSale , SalesAmount ) в SQL Server 2005, и мне нужно построить отчет с данными в этой таблице. Мне нужен SQL, который даст мне данные для этого отчета.
Фактическая таблица использовала BranchID, который я изменил на Branch в этом примере.
Сценарий установки
-- create sales table
CREATE TABLE Sales(
Branch varchar(30) NOT NULL,
DateOfSale smalldatetime NOT NULL,
SalesAmount money NOT NULL)
-- London: same week last year
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090714',100)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090715',200)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090716',300)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090717',400)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090718',500)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090719',600)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090720',700)
-- London: last 2 weeks sales
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090706',1000)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090707',1100)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090708',1200)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090709',1300)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090710',1400)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090711',1500)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090712',1600)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090713',1700)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090714',1800)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('London','20090715',1900)
-- Cape Town: last 2 weeks sales
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090706',2000)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090707',2100)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090708',2200)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090709',2300)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090710',2400)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090711',2500)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090712',2600)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090713',2700)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090714',2800)
INSERT INTO Sales (Branch, DateOfSale, SalesAmount) VALUES ('Cape Town','20090715',2900)
Предположения
- Первый день недели - понедельник
- Сегодняшняя дата - среда, 16 июля 2009 г.
Требуемый результат
Branch DailySales DailyLFL WTD WTDLFL LFL
London 1900.00 300.00 5400.00 600.00 Y
Cape Town 2900.00 2200.00 8400.00 6300.00
Ежедневные продажи
Продажи со вчерашнего дня
DailyLFL : сопоставимые продажи. Итак, продажи за этот день 1 год назад. Не в этот день, как в 15 июля, а в среду на 29-й неделе (то есть 16 июля). Если этому филиалу меньше года (например, филиал в Кейптауне), используйте продажи за последние недели (т.е. ср. На прошлой неделе). Если на прошлой неделе продаж не было, то ноль.
WTD : неделя до даты. Продажи подведены с понедельника на этой неделе до вчерашнего дня. Итак, пн, вт, ср в моем примере.
WTD LFL :
Неделя-на-дату Та же логика, что и у LFL, но на этот раз с WTD вместо ежедневных продаж
LFL :
Битовый флаг показывает, могли ли мы использовать LFL (значение: 1) или должны были использовать продажи за последние недели (значение: 0)
Поскольку это стандартные показатели розничных продаж, я надеюсь, что кто-то уже написал для них SQL. Может быть, не бит «если у тебя нет прошлого года, потом использовать последнюю неделю», но определенно LFL и WTD.
Если для решения требуется таблица календаря (например, http://tinyurl.com/nt5gck),, это нормально.