I have a table with the columns Sales_Date
and Sales
. I am looking for a solution to get Sales
for the last year from the Sales_Date
Column. Sales_Date
column has values from the year 2015 onwards.
For example:
Sales_Date | Sales |
---|---|
1/1/2016 | $25 |
1/8/2016 | $57 |
1/1/2015 | $125 |
1/8/2015 | $21 |
I am looking for the below result set:
Sales_Date | Sales | LYear_Sales_Date | LYear_Sales |
---|---|---|---|
1/1/2016 | $25 | 1/1/2015 | $125 |
1/8/2016 | $57 | 1/8/2015 | $21 |
CodePudding user response:
Filter all data to this year (
WHERE YEAR(Sales.Sales_Date) = 2016
).LEFT JOIN to the same table, combining each date with the same date one year prior (
Sales LEFT JOIN Sales AS Sales_LastYear ON Sales_LastYear.Sales_Date = DATEADD(year, -1, Sales.Sales_Date)
).SELECT the fields that you want (
SELECT Sales.Sales_Date, Sales_LastYear.Sales_Date AS LYear_Sales_Date, ...
).
Replace the LEFT JOIN with an INNER JOIN, if you want only those records that have a matching last-year record.
CodePudding user response:
Seems like LAG
would work here. Assuming you are always wanting the for the same (day and) month:
WITH CTE AS(
SELECT Sales_Date,
Sales,
LAG(Sales_Date) OVER (PARTITION BY DAY(Sales_Date), MONTH(Sales_Date) ORDER BY YEAR(Sales_Date)) AS LYear_Sales_Date,
LAG(Sales) OVER (PARTITION BY DAY(Sales_Date), MONTH(Sales_Date) ORDER BY YEAR(Sales_Date)) AS LYear_Sales
FROM dbo.YourTable)
SELECT Sales_Date,
Sales,
LYear_Sales_Date,
LYear_Sales
FROM CTE
WHERE Sales_Date >= '20160101'
AND Sales_Date < '20170101';