Вы указали, что идентификаторы являются последовательными.Тем не менее, я игнорирую это предположение и нумерую группы, используя LAG
и SUM...OVER
:
WITH yourdata(ID, Type, Quantity) AS (
SELECT 1, 'SampleA', 10 UNION
SELECT 2, 'SampleA', 1 UNION
SELECT 3, 'SampleA', 5 UNION
SELECT 4, 'SampleA', 9 UNION
SELECT 5, 'SampleB', 7 UNION
SELECT 6, 'SampleB', 10 UNION
SELECT 7, 'SampleA', 23
), cte_change_flag AS (
SELECT ID, Type, CASE WHEN LAG(Type) OVER (ORDER BY ID) = Type THEN 0 ELSE 1 END AS chg
FROM yourdata
), cte_group_number AS (
SELECT ID, Type, SUM(chg) OVER (ORDER BY ID) AS grp
FROM cte_change_flag
)
SELECT Type, Quantity, STUFF(XMLCol, 1, 1, '') AS IDRange
FROM (
SELECT Type, SUM(Quantity) AS Quantity
FROM yourdata
GROUP BY Type
) AS main_groups
CROSS APPLY (
SELECT CONCAT(',', MIN(ID), CASE WHEN MIN(ID) <> MAX(ID) THEN CONCAT('-', MAX(ID)) END)
FROM cte_group_number
WHERE Type = main_groups.Type
GROUP BY grp
FOR XML PATH('')
) AS sub_groups(XMLCol)
Результат:
| Type | Quantity | IDRange |
|---------|----------|---------|
| SampleA | 48 | 1-4,7 |
| SampleB | 17 | 5-6 |