Assuming, that it is a one time operation,
check out if below (rather tedious) gives some ideas :
The table
dataTable
Code:
TheID |
Unit |
BarCode |
Amount |
2 |
AAB |
Aac1 |
-2.75 |
15 |
AAB |
Aac1 |
2.75 |
14 |
AAB |
Aac1 |
2.75 |
3 |
AAB |
Aac1 |
1.24 |
17 |
AAB |
Aac1 |
-2.75 |
1 |
AAB |
Aac1 |
2.75 |
10 |
AAC |
Cac3 |
12.05 |
4 |
AAC |
Cac3 |
35 |
5 |
AAC |
Cac3 |
-20 |
6 |
AAC |
Cac3 |
20 |
9 |
AAC |
Bac2 |
-11 |
13 |
AAC |
Dac4 |
35 |
16 |
AAC |
Bac2 |
-11 |
8 |
AAC |
Bac2 |
11 |
7 |
AAD |
Cac3 |
16 |
12 |
AAD |
Cac3 |
-16.11 |
11 |
AAF |
Cac3 |
-12.05 |
1st Make-Table query
qryPositives
Code:
SELECT
dataTable.TheID,
dataTable.Unit,
dataTable.BarCode,
dataTable.Amount
INTO
tblqryPositives
FROM
dataTable
WHERE
(((dataTable.Amount)>0))
ORDER BY
dataTable.Unit,
dataTable.BarCode,
dataTable.Amount,
dataTable.TheID;
2nd Make-Table query
qryNegatives
Code:
SELECT
dataTable.TheID,
dataTable.Unit,
dataTable.BarCode,
dataTable.Amount
INTO
tblqryNegatives
FROM
dataTable
WHERE
(((dataTable.Amount)<0))
ORDER BY
dataTable.Unit,
dataTable.BarCode,
dataTable.Amount,
dataTable.TheID;
After running the above 1st and 2nd Make-Table queries
3rd Make-Table query
qrytblqryPositivesRanking
Code:
SELECT
tblqryPositives.Unit,
tblqryPositives.BarCode,
tblqryPositives.Amount,
tblqryPositives.TheID,
Count(*) AS TheRank
INTO
tblqrytblqryPositivesRanking
FROM
tblqryPositives
INNER JOIN
tblqryPositives AS tblqryPositives_1
ON
(tblqryPositives.Unit = tblqryPositives_1.Unit)
AND
(tblqryPositives.BarCode = tblqryPositives_1.BarCode)
AND
(tblqryPositives.Amount = tblqryPositives_1.Amount)
WHERE
(((tblqryPositives_1.TheID)<=[tblqryPositives].[TheID]))
GROUP BY
tblqryPositives.Unit,
tblqryPositives.BarCode,
tblqryPositives.Amount,
tblqryPositives.TheID
ORDER BY
tblqryPositives.Unit,
tblqryPositives.BarCode,
tblqryPositives.Amount,
tblqryPositives.TheID;
4th Make-Table query
qrytblqryNegativesRanking
Code:
SELECT
tblqryNegatives.Unit,
tblqryNegatives.BarCode,
tblqryNegatives.Amount,
tblqryNegatives.TheID,
Count(*) AS TheRank
INTO
tblqrytblqryNegativesRanking
FROM
tblqryNegatives
INNER JOIN
tblqryNegatives AS tblqryNegatives_1
ON
(tblqryNegatives.Amount = tblqryNegatives_1.Amount)
AND
(tblqryNegatives.BarCode = tblqryNegatives_1.BarCode)
AND
(tblqryNegatives.Unit = tblqryNegatives_1.Unit)
WHERE
(((tblqryNegatives_1.TheID)<=[tblqryNegatives].[TheID]))
GROUP BY
tblqryNegatives.Unit,
tblqryNegatives.BarCode,
tblqryNegatives.Amount,
tblqryNegatives.TheID
ORDER BY
tblqryNegatives.Unit,
tblqryNegatives.BarCode,
tblqryNegatives.Amount,
tblqryNegatives.TheID;
After running the 3rd and 4th Make_table queries
the Final query to run
qryFinal
Code:
SELECT
tblqrytblqryPositivesRanking.Unit,
tblqrytblqryPositivesRanking.BarCode,
tblqrytblqryPositivesRanking.Amount,
tblqrytblqryPositivesRanking.TheID,
tblqrytblqryPositivesRanking.TheRank,
tblqrytblqryNegativesRanking.Unit,
tblqrytblqryNegativesRanking.BarCode,
tblqrytblqryNegativesRanking.Amount,
tblqrytblqryNegativesRanking.TheID,
tblqrytblqryNegativesRanking.TheRank
FROM
tblqrytblqryPositivesRanking
INNER JOIN
tblqrytblqryNegativesRanking
ON
(tblqrytblqryPositivesRanking.Unit=tblqrytblqryNegativesRanking.Unit)
AND
(tblqrytblqryPositivesRanking.BarCode=tblqrytblqryNegativesRanking.BarCode)
AND
(tblqrytblqryPositivesRanking.Amount=ABS(tblqrytblqryNegativesRanking.Amount))
AND
(tblqrytblqryPositivesRanking.TheRank=tblqrytblqryNegativesRanking.TheRank);
Code:
tblqrytblqryPositivesRanking.Unit |
tblqrytblqryPositivesRanking.BarCode |
tblqrytblqryPositivesRanking.Amount |
tblqrytblqryPositivesRanking.TheID |
tblqrytblqryPositivesRanking.TheRank |
tblqrytblqryNegativesRanking.Unit |
tblqrytblqryNegativesRanking.BarCode |
tblqrytblqryNegativesRanking.Amount |
tblqrytblqryNegativesRanking.TheID |
tblqrytblqryNegativesRanking.TheRank |
AAB |
Aac1 |
2.75 |
1 |
1 |
AAB |
Aac1 |
-2.75 |
2 |
1 |
AAB |
Aac1 |
2.75 |
14 |
2 |
AAB |
Aac1 |
-2.75 |
17 |
2 |
AAC |
Bac2 |
11 |
8 |
1 |
AAC |
Bac2 |
-11 |
9 |
1 |
AAC |
Cac3 |
20 |
6 |
1 |
AAC |
Cac3 |
-20 |
5 |
1 |
Note : Be sure to take a look at my signature, specially the last part.
Thanks