You have a large table (in my case it has 8,697,647 records) with an Asset Number and a Business Unit, and you would like to know if any asset has record with multiple Business Units.
You can count records of unique Asset/BU combinations, but this is not what you want:
SELECT FLNUMB, FLMCU, COUNT(FLAID) AS COUNT FROM JDE_CRP.CRPDTA.F1202 GROUP BY FLNUMB, FLMCU ORDER BY FLNUMB, FLMCU
This query will return results similar to these:
| FLNUMB | FLMCU | COUNT |
| 84865 | 12000 | 66 |
| 84866 | 12000 | 66 |
| 84867 | 12000 | 75 |
| 84867 | 12704 | 18 |
| 84867 | 12705 | 28 |
| 84868 | 12000 | 75 |
| 84868 | 12715 | 22 |
| 84868 | 12717 | 32 |
| 84869 | 12000 | 66 |
| 84870 | 12000 | 75 |
| 84870 | 12535 | 40 |
| 84871 | 12000 | 66 |
| 84872 | 12000 | 66 |
To get to a desired output, you need to wrap the results of query above and count if any Asset belongs to more than one BU:
SELECT A.FLNUMB, MIN(A.FLMCU) AS [Min BU],
MAX(A.FLMCU) AS [Max BU], COUNT(A.FLNUMB) AS COUNT
FROM ( SELECT FLNUMB, FLMCU
FROM JDE_CRP.CRPDTA.F1202 GROUP BY FLNUMB, FLMCU ) A
GROUP BY A.FLNUMB
HAVING COUNT(*) > 1
ORDER BY A.FLNUMB
This query will return results similar to these:
| FLNUMB | Min BU | Max BU | COUNT |
| 84853 | 14046 | 14054 | 2 |
| 84857 | 14023 | 14046 | 2 |
| 84867 | 12000 | 12705 | 3 |
| 84868 | 12000 | 12717 | 3 |
| 84870 | 12000 | 12535 | 2 |
| 85697 | 12000 | 12750 | 4 |
| 85711 | 14046 | 14054 | 2 |
Special feature of this output is that we not only listing Assets that have depreciation in multiple Business Units, but we even provide MIN and MAX Business Units as a point of reference.
To make our task even more interesting, let’s count number of combinations of three fields:
– Asses Number,
– Business Unit and
– Fiscal Year.
As in previous case, we start with sub-query:
SELECT FLNUMB, FLMCU, FLFY, COUNT(*) FROM F1202 GROUP BY FLNUMB, FLMCU, FLFY ORDER BY FLNUMB, FLMCU, FLFY
This query will return results similar to these:
| FLNUMB | FLMCU | FLFY | COUNT |
| 25747 | 10654 | 13 | 9 |
| 74774 | 10691 | 12 | 9 |
| 40551 | 10501 | 9 | 9 |
| 72253 | 10575 | 8 | 9 |
| 27055 | 10691 | 6 | 9 |
| 36794 | 10760 | 14 | 6 |
| 52905 | 10691 | 12 | 6 |
| 112074 | 12995 | 17 | 20 |
| 37149 | 10707 | 6 | 6 |
| 39456 | 10691 | 15 | 6 |
Now. Let’s wrap the sub-query onto another SELECT statement:
SELECT A.FLNUMB, A.FLMCU, COUNT(A.FLNUMB) AS COUNT FROM ( SELECT FLNUMB, FLMCU, FLFY FROM F1202 GROUP BY FLNUMB, FLMCU, FLFY ) A GROUP BY A.FLNUMB, A.FLMCU HAVING COUNT(*) > 1
Statement above will return results similar to these:
| FLNUMB | FLMCU | COUNT |
| 85311 | 10672 | 10 |
| 18801 | 14202 | 13 |
| 80122 | 10566 | 11 |
| 40774 | 10754 | 5 |
| 74281 | 10792 | 12 |
| 49796 | 10633 | 13 |
| 69883 | 10692 | 13 |
You can even bring in MIN and MAX fiscal years for each unique Asset/BU combination:
SELECT A.FLNUMB, A.FLMCU, MIN(FLFY) AS [Min FY],
MAX(FLFY) AS [Max FY], COUNT(A.FLNUMB) AS COUNT
FROM ( SELECT FLNUMB, FLMCU, FLFY, COUNT(FLAID) AS COUNT
FROM F1202 GROUP BY FLNUMB, FLMCU, FLFY ) A
GROUP BY A.FLNUMB, A.FLMCU
HAVING COUNT(*) > 1
ORDER BY A.FLNUMB, A.FLMCU
Statement above will return results similar to these:
| FLNUMB | FLMCU | Min FY | Max FY | COUNT |
| 72196 | 10000 | 6 | 17 | 12 |
| 75179 | 10025 | 7 | 17 | 11 |
| 68802 | 10040 | 5 | 6 | 2 |
| 68814 | 10040 | 5 | 6 | 2 |
| 68825 | 10040 | 5 | 6 | 2 |
| 68836 | 10040 | 5 | 6 | 2 |
| 35112 | 10042 | 5 | 8 | 4 |
It would be interesting to hear, if counting unique combinations of two or more fields in a table is possible without using a subquery.

Be the first to comment