Я работаю только с SQL Server. Если что-то другое, попробуйте применить ту же логику.
Декларирование временную таблицу для проверки запроса:
DECLARE @Sales TABLE (
[Date] DATE,
Store NVARCHAR(10),
Sales INT
)
INSERT INTO @Sales VALUES
('1/1/2015','St01',12123),
('1/1/2015','St02',3123),
('1/1/2016','St01',4213),
('1/1/2016','St03',2134);
SELECT * FROM @Sales;
Фактический запрос:
SELECT
CY_Date = CASE
WHEN CY.Date IS NULL THEN DATEADD(YEAR, 1, LY.Date)
ELSE CY.Date
END,
LY_Date = CASE
WHEN LY.Date IS NULL THEN DATEADD(YEAR, -1, CY.Date)
ELSE LY.Date
END,
Store = CASE
WHEN CY.Store IS NULL THEN LY.Store
ELSE CY.Store
END,
ISNULL(CY.Sales, 0) AS CY_Sales,
ISNULL(LY.Sales, 0) AS LY_Sales
FROM @Sales CY
FULL JOIN @Sales LY ON (CY.Store = LY.Store AND LY.Date = DATEADD(YEAR, -1, CY.Date))
WHERE (CY.Date = '1/1/2016' OR CY.Date IS NULL)
AND (LY.Date = DATEADD(YEAR, -1, '1/1/2016') OR LY.Date IS NULL);
Результат:
CY_Date LY_Date Store CY_Sales LY_Sales
2016-01-01 2015-01-01 St01 4213 12123
2016-01-01 2015-01-01 St03 2134 0
2016-01-01 2015-01-01 St02 0 3123
Как это работает:
- ПОЛНЫЙ РЕГИСТРИРУЙТЕСЬ будет совместит в магазин и строки из текущего и предыдущего года.
- Предложение WHERE будет фильтроваться к текущей дате '1/1/2016'. NULL разрешены, потому что иногда у вас нет линий для текущего или за последний год.
- В столбцах CASES используются для создания дат, если они являются нулевыми (если текущая дата равна нулю, получите последний год + 1 год и наоборот), чтобы создать хранилище, если они являются нулевыми и помещаются вместо нуля в столбцах продаж.
Вам даже нужна эта первая колонка «Дата» там в результатах yoru? – chungtinhlakho
Да, мне это понадобится для еженедельных и ежемесячных продаж. – badry