首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用t构建复杂报表,每一行都有自己的where条件。

使用t构建复杂报表,每一行都有自己的where条件。
EN

Stack Overflow用户
提问于 2015-08-05 20:47:16
回答 1查看 88关注 0票数 2

我正在用T构建一个复杂的报告。用户给了我一个表,该表是报表源代码,大约有10毫行。表包含描述性属性和数值列,如下所示:

片段product_group gmis lpt numeric_field1 numeric_field2 numeric_field3

报表大约有一千行,报表的定义是逐行进行的,如下所示:

‘第一行的名称’- 3,4,5段的numeric_field1和,lpt =3和gmi <> 50

“第二行”-- 1,2,3段和lpt <> 5中段的<>和,gmis =7

‘第3行’-取num2 + num3表示product_id =7

‘第4行’-第1行+第2行

因此,我最终使用了t查询,该查询对每一行都有单独的select,后面跟着union all:

代码语言:javascript
复制
'Row number 1' name, (select sum(num1) from source_table where segment in (3,4,5) and lpt=3 and gmis <> 50) value
union
'Row number 2'  , (select sum(num2) from source_table where segment in (1,2,3) and lpt<> 5 and gmis = 7) 
union
'Row number 3' , (select sum(num2 + num3) from source_table where product_id = 7) 

.……等

我是不是错过了做这种查询的更聪明的方法??因为报告很慢..。

EN

回答 1

Stack Overflow用户

发布于 2015-08-11 15:48:23

假设您总是从同一个基表中进行选择,并且总是在不进行分组的情况下进行聚合,那么下面的内容应该适合您的目的。

  1. 与其组合多个选择,不如对单个表执行一组操作。将where子句合并到select语句中,作为一组where子句计算用于聚合的基值。这意味着您只需读取一次源表: 在(3,4,5)和lpt =3和gmi <> 50中选择Case,然后选择num1 Else 0结束为row1,当段在(1,2,3)和lpt<> 5和gmis =7时,选择num1 lpt<>0结束为row2,当product_id =7时,(num2+num3) Case 0结束为row3 ( source_table )
  2. 将其用作表表达式,并执行从表表达式中选择的聚合。在本例中,我使用了一个CTE (公共表表达式): ;以Column_Values ( row1,row2,row3 )为(选择(3,4,5)段时的选择情况,选择lpt =3和gmis <> 50,然后num1 row3 0结束为row1,当段在(1,2,3)和lpt<> 5和gmis =7,然后num1 lpt<>0结束为row2,当product_id =7然后(num2+num3) Case 0结束为row3从source_table )选择名称,值(选择Sum(row1)为第1行,Sum(row2)为第2行,Sum(row3)为第3行,Sum(row1) + Sum(row2)为Column_Values的第4行)
  3. 现在,将这些值作为一系列列使用。若要将它们转换为行,请使用un枢轴命令: ;以Column_Values ( row1,row2,row3 )为(选择(3,4,5)段时的选择情况,选择lpt =3和gmis <> 50,然后num1 row3 0结束为row1,当段在(1,2,3)和lpt<> 5和gmis =7,然后num1 lpt<>0结束为row2,当product_id =7然后(num2+num3) Case 0结束为row3从source_table )选择名称,值(选择Sum(row1)为第1行,Sum(row2)为第2行,Sum(row3)为第3行,Sum(row1 + row2)为Column_Values中的第4行)第2行,第3行,第4行)

如果您仍然存在性能问题,请考虑以下选项,这些选项将取决于您的需求:

·如果您不需要报告实时数据,您可以预先计算这些值,将它们存储在另一个表中,然后从这个表中报告。

·如果您有企业版,并且不需要报告活动数据,您可以在源表上放置一个列存储索引--在Server 2012中,这使得表只能读取,因此每次将新数据加载到源表时都必须删除和重新创建。当聚合大型表时,Columnstore索引可以提供巨大的性能提升。

如果需要报告实时数据,可以使用索引视图。当在视图中聚合数据时,这可能会提高性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31842514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档