I have a database which give me sale and profit for each date. Schema looks like following :
Date Sales Profit
2015-03-07 133333 12348
2015-03-08 214563 34545
2015-03-09 299593 59940
Now I want to get results like following:
Today MTD YTD
Sales
Profit
The brute-force approach I am using have 6 sub-queries with union.
It looks like following:
SELECT 'Sales', TotalSales, 0, 0
FROM SalesTable
where Date = GETDATE()
UNION
SELECT 'Sales',0, SUM(TotalSales), 0
FROM SalesTable
where MONTH(Date) = MONTH(GETDATE())
UNION
SELECT 'Sales',0,0, SUM(TotalSales)
FROM SalesTable
where YEAR(Date) = YEAR(GETDATE())
and the similar for profit.
How can this be done in a more efficient/structural way?
Best Answer
Mocked up some data and used a couple of CTEs to generate the aggregates. Similar to creating a bunch of separate queries joined or unioned however you wanted. This provides a little more readability and flexibility. I also added a variable to simulate running this for different dates.