【问题标题】:SQL Server report query design and optimizationSQL Server报表查询设计与优化
【发布时间】:2018-08-24 05:06:33
【问题描述】:

我必须创建一个 SSRS 报告,该报告应该同时显示汇总数据和非汇总数据,但幸好不是同时显示。我想知道是否可以在一个存储过程和一个报告中做到这一点。

报告有一个包含值的下拉列表:

  • 显示汇总
  • 显示非聚合

让用户决定显示哪些数据。

此外,数据应由CountryId 列连接。

我有一个Finance 表,看起来像:

FinanceId | CountryId | Year | I | II | III
----------+-----------+------+---+----+-----
1         | 1         | 2016 | 1 | 1  |  1 
2         | 1         | 2016 | 2 | 2  |  2 


//this is how I return grouped and summed data (there are many rows in this table, I left only two for better readability)

WITH CTE_Grouped1 
(
     SELECT 
         FinanceId, Year, I, II, III 
     WHERE 
         FinanceId = 1
)
, CTE_Grouped2
(
      SELECT FinanceId, Year, I, II, III 
      WHERE FinanceId = 2
)
SELECT 
    CTE_Grouped1.FinanceId,
    CTE_Grouped1.Year,
    SUM(Grouped1.I),
    SUM(Grouped1.II),
    SUM(Grouped1.III),
    SUM(Grouped2.I),
    SUM(Grouped2.II),
    SUM(Grouped2.III)
FROM
    CTE_Grouped1 
JOIN 
    CTE_Grouped2 ON CTE_Grouped1.CountryId = CTE_Grouped2.CountryId
GROUP BY 
    CTE_Grouped1.FinanceId, CTE_Grouped1.Year

//this is how I could return not aggregated data
SELECT * FROM Finance

我的问题是,如何以用户选择的方式返回数据。

查询比较复杂,我不清楚该怎么做。

我应该创建两个单独的报告还是应该有一个聪明的方法来实现这一点。

【问题讨论】:

标签: sql-server reporting-services


【解决方案1】:

这两个查询具有不同的“形状”,因此,不,您应该使用两个不同的查询和两个不同的数据集。您可以根据参数值切换报表元素的可见性,并且可以将参数值注入到每个查询中,以在您不显示其视觉对象时强制它返回零行。参见例如SSRS conditional execution of dataset

【讨论】:

  • 谢天谢地形状是一样的,我的意思是列数是恒定的。我想把这段代码分成两个程序,因为有超过 500 行代码,很难理解那里发生了什么。
  • 以上代码只是示例代码,我不想在这里重写整个程序。
【解决方案2】:

你应该创建 3 个存储过程,

proc1:将详细数据拉入临时表(每次执行时截断表并插入)

proc2:首先执行第一个 proc,然后拉取您在第一个 proc 中填充的表中的所有详细信息

proc3:从明细表中提取并汇总,然后返回汇总数据

*然后在 SSRS 中只需添加 2 个数据集

数据集 1:这个 execs proc 2

数据集 2:执行过程 3

希望这对你有意义

【讨论】:

  • 这根本不是一个好方法。您建议使用持久表作为临时表。这有疯狂的并发问题。
  • 你有我可以阅读的文档吗?我不知道,谢谢指出
  • 您不需要文档。想一想。假设该过程从开始到结束需要 4 秒。我首先开始,您截断包含我要查看的数据的表。 2 秒后开始。我用于我的目的的表刚刚被您的线程截断并再次填充。明白我在说什么了吗?
  • 好吧,我不喜欢“我不需要文档”这句话,我认为文档很重要,但是我会自己研究,是的,你说的对我来说很有意义
  • 我不喜欢为了暂时使用而复制数据,但这种方法可以在您的第一个过程中使用临时表。
猜你喜欢
  • 1970-01-01
  • 2011-10-15
  • 2017-07-22
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 2013-10-04
相关资源
最近更新 更多