创建一些测试数据:
DECLARE @TopTen TABLE
(
Id INT,
Description VARCHAR(100),
Qty INT
)
INSERT INTO @TopTen
( Id, Description, Qty )
VALUES
( 1, 'Test1', 1 ),
( 2, 'Test1', 1 ),
( 3, 'Test1', 1 ),
( 4, 'Test1', 10 ),
( 5, 'Test1', 10 ),
( 6, 'Test1', 10 ),
( 7, 'Test1', 100 ),
( 8, 'Test1', 100 ),
( 9, 'Test1', 100 ),
( 10, 'Test1', 1000 ),
( 11, 'Test1', 1000 ),
( 12, 'Test2', 1 ),
( 13, 'Test2', 1 ),
( 14, 'Test2', 1 ),
( 15, 'Test2', 10 ),
( 16, 'Test2', 10 ),
( 17, 'Test2', 10 ),
( 18, 'Test2', 100 ),
( 19, 'Test2', 100 ),
( 20, 'Test2', 100 ),
( 21, 'Test2', 1000 ),
( 22, 'Test2', 1000 );
我在这里获取数据并将数量整理成 CTE
WITH T AS
(
SELECT *,
ROW_NUMBER() OVER (ORDER BY QTY DESC) RN
FROM @TopTen
)
现在让我们从 CTE 中提取前 10 条记录,然后合并并汇总所有其他记录,给出一些虚假 id 以显示哪些是总计记录
SELECT * FROM
(
SELECT t.Id, t.Description, t.Qty, t.RN
FROM T WHERE t.RN <= 10
UNION
SELECT 9999 AS Id,
MAX(t.Description) AS Description,
SUM(QTY),
9999 AS RN
FROM T
WHERE t.RN > 10
GROUP BY t.Description
) d
ORDER BY RN, Description
这是输出:
Id Description Qty RN
10 Test1 1000 1
11 Test1 1000 2
21 Test2 1000 3
22 Test2 1000 4
18 Test2 100 5
19 Test2 100 6
20 Test2 100 7
7 Test1 100 8
8 Test1 100 9
9 Test1 100 10
9999 Test1 33 9999
9999 Test2 33 9999