2014-07-22 22 views
0

我有一个每日报告,显示我一个简单的网格:[Id],[Descripction]和[数量]。 用户问我只显示前10位的数量值,不错,我应用过滤器Top n,但是也要求在一行中显示其他值,表示“其他”,我知道如何在图中执行此操作,但我从来没有在Tablix那样做过。组排名前n和后排n在一行SSRS

请帮忙。

感谢

+0

你的意思是你展示基于ID是10行(前十名),然后1,在排名前十不是加起来所有其他quantitys合计行,降序? –

+0

是的,那就是,我必须有11行,前10位一行一行,没有前十位总和在一行。 – Necktru

回答

0

创建一些测试数据:

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然后合并并总结所有其他记录,给出一些虚假编号来显示哪些是总计记录

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