Вы можете просто сделать это в SQL, используя несколько вложенных запросов. Предположим, у вас есть следующие таблицы: транзакция, пользователь, устройство и группа. Таблица транзакций записывает транзакции пользователя на устройстве и имеет поле Сумма для суммирования. Пользователь принадлежит к группе.
Таким образом, вам необходимо сложить сумму для пользователя, для групп и для устройств, используемых в группе, что даст вам SQL, который выглядит следующим образом:
SELECT G.Description AS [Group], D.Description AS Device, U.Description AS UserName, MAX(GT.GroupTotal) AS GroupTotal, MAX(GDT.GroupDeviceTotal) AS GroupDeviceTotal, SUM(T.Amount) AS UserTotal
FROM Transaction AS T
INNER JOIN User AS U ON L.UserId = F.UserId
INNER JOIN Group AS G ON G.GroupId = L.GroupId
INNER JOIN Device AS D ON T.DeviceId = L.DeviceId
INNER JOIN
(SELECT GroupId, SUM(Amount) AS GroupTotal
FROM Transaction
INNER JOIN User ON User.UserId = Transaction.UserId
WHERE (Transaction.TxDate >= '2011-01-01')
GROUP BY User.GroupId) AS GT ON GT.GroupId = U.GroupId
INNER JOIN
(SELECT GroupId, DeviceId, SUM(Amount) AS GroupDeviceTotal
FROM Transaction
INNER JOIN User ON User.UserId = Transaction.UserId
WHERE (TxDate >= '2011-01-01')
GROUP BY GroupId, DeviceId) AS GDT ON GDT.GroupId = U.GroupId AND GDT.DeviceId = T.DeviceId
WHERE (T.TxDate >= '2011-01-01')
GROUP BY G.GroupId, D.DeviceId, U.UserId
ORDER BY GroupTotal DESC, GroupDeviceTotal DESC, UserTotal DESC
Обратите внимание, что выражение where, которое вы используете, должно быть одинаковым в основном запросе и каждом вложенном запросе (это бит "WHERE (T.TxDate> = '2011-01-01')").