Это твик в ответе Ника. Я думаю, что full join
очень важно в такой ситуации, потому что вполне возможно, что некоторые идентификаторы отсутствуют в одной или другой таблице:
SELECT ID, a.cnt, b.cnt,
(COALESCE(a.cnt, 0) - COALESCE(b.cnt, 0)) as difference
FROM (SELECT UPPER(ID) as id, COUNT(*) AS cnt
FROM A
GROUP BY UPPER(ID)
) A FULL JOIN
(SELECT UPPER(ID) as id, COUNT(*) AS cnt
FROM B
GROUP BY UPPER(ID)
) B
USING (ID)
ORDER BY difference DESC;
Добавить:
WHERE COALESCE(a.cnt, 0) <> COALESCE(b.cnt)
если вы хотите только идентификаторы, где количество не совпадает.