I am using Microsoft Access 2016 and there is table where I want to count each occurrence of a value in a column grouping by another column. Below is sample data from the table:
| ID | Date | Weekday | Trip_ID | Day | Location |
|---|---|---|---|---|---|
| 1 | 9/11/2022 | Mon | TI06091122 | 1 | Florida |
| 2 | 9/12/2022 | Tue | TI06091122 | 2 | Travel Day |
| 3 | 9/13/2022 | Wed | TI06091122 | 3 | Georgia |
| 4 | 9/14/2022 | Thu | TI06091122 | 4 | South Carolina |
| 5 | 9/15/2022 | Fri | TI06091122 | 5 | North Carolina |
| 6 | 9/16/2022 | Sat | TI06091122 | 6 | Travel Day |
| 7 | 9/17/2022 | Sun | TI06091122 | 7 | Florida |
| 8 | 9/18/2022 | Mon | TI06091822 | 1 | Florida |
| 9 | 9/19/2022 | Tue | TI06091822 | 2 | Travel Day |
| 10 | 9/20/2022 | Wed | TI06091822 | 3 | Travel Day |
| 11 | 9/21/2022 | Thu | TI06091822 | 4 | Travel Day |
| 12 | 9/22/2022 | Fri | TI06091822 | 5 | Colorado |
| 13 | 9/23/2022 | Sat | TI06091822 | 6 | California |
| 14 | 9/24/2022 | Sun | TI06091822 | 7 | Florida |
I want to group the data by Trip_ID and then do a rolling count for each Location. The result I am aiming for is this:
| Trip_ID | Location | RunningCount |
|---|---|---|
| TI06091122 | Florida | 1 |
| TI06091122 | Travel Day | 1 |
| TI06091122 | Georgia | 1 |
| TI06091122 | South Carolina | 1 |
| TI06091122 | North Carolina | 1 |
| TI06091122 | Travel Day | 2 |
| TI06091122 | Florida | 2 |
| TI06091822 | Florida | 1 |
| TI06091822 | Travel Day | 1 |
| TI06091822 | Travel Day | 2 |
| TI06091822 | Travel Day | 3 |
| TI06091822 | Colorado | 1 |
| TI06091822 | California | 1 |
| TI06091822 | New Mexico | 1 |
| TI06091822 | Florida | 2 |
I am able to do a rolling total for the whole table by adding a temporary column equal to 1, and then using DSUM on that column.
DSUM("Temp_Col","Table", "ID<=" & ID) As RunningCount
I believe if I do some sort of subquery per Trip_ID that would do the DSUM I would get what I am looking for, but am unable to determine how to set it up.
Any help would be greatly appreciated. Thank you.
CodePudding user response:
You would need to include Trip_id and Location references in your DSum() criteria in order to get the count for each combination of those two fields. However, since you're actually after a count, use DCount() instead of "... adding a temporary column equal to 1, and then using DSUM on that column".
Here is a tested example with a DCount() expression for that derived column:
SELECT
hp.Trip_ID,
hp.Location,
DCount(
"*",
"tblHuskypride",
"Trip_ID='" & hp.Trip_id & "' AND Location='" & hp.Location & "' AND ID<=" & hp.ID
) AS RunningCount
FROM tblHuskypride AS hp
ORDER BY hp.Date;
(Notice I renamed my copy of the table to "tblHuskypride".)
Although that gives you what I think you want, I don't like all the quotes it requires. So I would prefer to use a correlated subquery as in the following example.
SELECT
hp.Trip_ID,
hp.Location,
(
SELECT Count(*)
FROM tblHuskypride AS hp2
WHERE
hp2.Trip_ID=hp.Trip_ID
AND hp2.Location=hp.Location
AND hp2.Date<=hp.Date
) AS RunningCount
FROM tblHuskypride AS hp
ORDER BY hp.Date;
Notice I chose to use the Date field instead of ID for the counting. If that's not satisfactory, swap ID for Date. Here is the output from that query tested with your sample data:
| Trip_ID | Location | RunningCount |
|---|---|---|
| TI06091122 | Florida | 1 |
| TI06091122 | Travel Day | 1 |
| TI06091122 | Georgia | 1 |
| TI06091122 | South Carolina | 1 |
| TI06091122 | North Carolina | 1 |
| TI06091122 | Travel Day | 2 |
| TI06091122 | Florida | 2 |
| TI06091822 | Florida | 1 |
| TI06091822 | Travel Day | 1 |
| TI06091822 | Travel Day | 2 |
| TI06091822 | Travel Day | 3 |
| TI06091822 | Colorado | 1 |
| TI06091822 | California | 1 |
| TI06091822 | Florida | 2 |
