звучит так, как будто вы запрашиваете, было бы неплохо использовать с накоплением
select cola, colb, SUM(colc) AS sumc
from table
group by cola, colb
with rollup
Это даст сумму для колба и сумму накопления для колы. Пример результата ниже. Надеюсь, форматирование работает. Нулевые значения - это сводные суммы для группы.
cola colb sumc
1 a 1
1 b 4
1 NULL 5
2 c 2
2 d 3
2 NULL 5
NULL NULL 10
Пойди и дай мне знать, сработало ли это.
- EDIT
Хорошо, я думаю, что получил это, поскольку он работает на небольшом наборе тестов, который я использую. Я сам начал видеть место, где мне это нужно, так что спасибо за вопрос. Я признаю, что это немного грязно, но должно работать для любого количества уровней и будет возвращать сумму только на самом высоком уровне.
Я сделал предположение, что в продуктах есть числовое поле.
with x
as (
select c.CategoryID, c.parentid, p.number, cast(c.CategoryID as varchar(8000)) as grp, c.CategoryID as thisid
from Categories as c
join Products as p on p.Categoryid = c.CategoryID
union all
select c.CategoryID, c.parentid, p.number, cast(c.CategoryID as varchar(8000))+'.'+x.grp , x.thisid
from Categories as c
join Products as p on p.Categoryid = c.CategoryID
join x on x.parentid = c.CategoryID
)
select x.CategoryID, SUM(x.number) as Amount
from x
left join Categories a on (a.CategoryID = LEFT(x.grp, case when charindex('.',x.grp)-1 > 0 then charindex('.',x.grp)-1 else 0 end))
or (a.CategoryID = x.thisid)
where a.parentid = 0
group by x.CategoryID