I've got a SQL Server CE 3.5 table (Transactions) with the following Schema:
- ID
- Transaction_Date
- Category
- Description
- Amount
Query:
SELECT Transaction_Date, SUM(Amount)
FROM Transactions
GROUP BY Transaction_Date;
I'm trying to do a SUM(Amount) and group by transaction_date just so I can get the total amount for each day but I want to get back values even for days there were no transactions so basically the record for a day with no transactions would just have $0.00 for amount.
Thanks for the help!
Once you have a Calendar table (more on that later) you can then do an inner join on the range of your data to fill in missing dates:
To create a calendar table, you can use a CTE:
Combining the two, we have
If you want dates that don't have transactions to appear you can add a DUMMY transaction for each day with the amount of zero it won't interfere with SUM and would so what you want
You'll need to upper and lower bound your statement somehow, but perhaps this will help.
Not sure if any this works with CE
With common table expressions
With loop + temporary table
You need a Calendar table to select over the dates. Alternatively, if you have a Numbers table, you could turn that effectively into a Calendar table. Basically, it's just a table with every date in it. It's easy enough to build and generate the data for it and it comes in very handy for these situations. Then you would simply use:
A few things to keep in mind:
If you're sending this to a front-end or reporting engine then you should just send the dates that you have (your original query) and have the front end fill in the $0.00 days itself if that's possible.
Also, I've assumed here that the date is an exact date value with no time component (hence the "=" in the join). Your calendar table could include a "start_time" and "end_time" so that you can use BETWEEN for working with dates that include a time portion. That saves you from having to strip off time portions and potentially ruining index usage. You could also just calculate the start and end points of the day when you use it, but since it's a prefilled work table it's easier IMO to include a start_time and end_time.