如何使用SQL Server增强报告功能?

时间:2018-01-16 20:31:10

标签: sql-server reporting-services reporting

这个问题有点宽泛,所以请提前道歉。

我最近工作的公司改用了一个新的系统,该系统使用的是SQL Server而不是Mysql,我们的团队负责将几个旧的报告带到。由于新系统对事物的模拟方式略有不同,因此我们的目标并不是与旧报告保持一致。

这些是我们目前的限制:

  • 我们只能提供SSRS报告 - 仅适用于.rdl文件
  • 我们可以查询数据库并添加视图
  • 由于某些许可协议,我们无法添加存储过程和功能
  • 我们也无法向服务器添加其他数据库

但是,据我所知,有些报告需要:

  • 通过循环数据任意次数来构建表格(例如,走一条物料结构)
  • 在评估期间进行一些小的状态跟踪,例如运行总计

我试图通过CTE和ROW_NUMBER的组合来聪明地解决第二个要求,例如:

with t as 
(
    select 
        row_num = row_number() over (order by a), 
        a, b, c 
    from 
        table1
)
select
    a, 
    (select sum(b) from t t2 where t2.row_num < t.row_num) as running_b,
    (select sum(c) from t t3 where t3.row_num < t.row_num) as running_c
from 
    t
order by 
    row_num;

在这种情况下,row_number是必需的,因为a值可能相同。

但是,SQL Server似乎没有为每一行正确地进行数学运算,或者我误解了有关查询的内容。一位同事经常抱怨枢轴功能存在类似问题。

我的问题不是关于单个查询。我们需要在当前的限制内为查询添加更多功能,我需要一些如何做到这一点的建议。

有人可以帮忙吗?

更新

在参考示例查询时,我发现如果我将subselect与left self-join和group子句交换,SQL Server给了我预期的结果:

with t as 
(
    select 
        row_num = row_number() over (order by a), 
        a, b, c 
    from 
        table1
)
select
    a, 
    sum(t2.b) as running_b,
    sum(t2.c) as running_c
from 
    t
    left join t t2 on t2.row_num < t.row_num
group by 
    t.row_num, t.a
order by 
    row_num;

此外,雅各布让我了解递归CTE,我认为这将有助于解决另一个问题。我认为这两种技术解决了我最紧迫的问题。

0 个答案:

没有答案