It looks like you are trying to summarize adjacent ranges (islands) of the same foodidsorted by cartid?
;with cart as
(
SELECT 92 AS cartid,107 AS orderid,5 AS foodid, 1 AS qty UNION ALL
SELECT 93,107,5, 1 UNION ALL
SELECT 94,107,5, 1 UNION ALL
SELECT 95,107,11,1 UNION ALL
SELECT 96,107,5, 1 UNION ALL
SELECT 97,108,5, 1
),
NumberedCart As
(
SELECT cartid,foodid,qty,
ROW_NUMBER() OVER (ORDER BY cartid)-
ROW_NUMBER() OVER (PARTITION BY foodid ORDER BY cartid) AS G
FROM cart
)
SELECT foodid, SUM(qty) AS [sum(qty)]
FROM NumberedCart
GROUP BY foodid,G
ORDER BY MIN(cartid)
Returns
foodid sum(qty)
----------- -----------
5 3
11 1
5 2
source
share