【问题标题】:Group top n and botton n in one row SSRS将前 n 和后 n 分组在一行中 SSRS
【发布时间】:2014-07-22 15:55:34
【问题描述】:

我有一份每日报告,其中显示了一个简单的网格:[Id]、[Description] 和 [Qty]。 用户要求我只显示前 10 个数量值,很好,我应用了过滤器 Top n,也要求在一行中显示其他值,上面写着“其他”,我知道该怎么做这在图表中,但我从不在 Tablix 中这样做。

请帮忙。

谢谢

【问题讨论】:

  • 您的意思是显示 10 行(前 10 行),然后显示 1 总行,根据 id、desc 将不在前 10 名中的所有其他数量加起来?
  • 是的,就是这样,我必须有 11 行,前十行和没有前十的总和在一行。

标签: sql-server reporting-services report


【解决方案1】:

创建一些测试数据:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2018-02-14
    • 2016-08-11
    • 2015-04-21
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多