【发布时间】:2015-10-28 19:40:29
【问题描述】:
我正在使用 T-SQL 构建一份复杂的报表。用户给了我一个报告来源的表格,大约有 1000 万行。表包含描述性属性和数字列,如下所示:
segment product_group gmis lpt numeric_field1 numeric_field2 numeric_field3
报告有大约一千行,报告的定义逐行如下:
'第一行的名称' - 3、4、5 和 lpt = 3 和 gmis 50 中段的 numeric_field1 的总和
'第二行' - 1,2,3 和 lpt 5 和 gmis = 7 中段的 num2 之和
'Row number 3' - num2 + num3 for product_id = 7
'第 4 行' - 第 1 行 + 第 2 行
所以我最终得到了 t-sql 查询,它对每一行都有单独的选择,然后是 union all:
'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)
..... …… 等等
我是否错过了一些更聪明的方法来进行这种查询?因为报告很慢....
【问题讨论】:
-
使用适当的软件(MySQL、Oracle、DB2...)和版本标记数据库问题很有帮助,例如
sql-server-2014。语法和功能的差异通常会影响答案。例如,在 SQL Server 的最新版本中,可能会应用公用表表达式 (CTE) 来避免重复某些查询。 -
我刚刚添加了sql server 2012 有问题....
-
不是真正的答案,但在上面的示例中,您使用“UNION”而不是“UNION ALL”;我只是想确定这是示例中的错字,而不是代码中的错字。即使在 UNION 语句上也会导致对您的查询进行 DISTINCT 搜索,这可能会对性能造成很大影响。
-
@Stuart Ainsworth:你说得对,我一直在考虑联合,但在查询中写了联合(不仅仅是在这个例子中,而是在查询本身......谢谢你,这个是向前迈出的第一步:)。但如果可能的话,我想以某种方式完全避免为每一行编写新查询......
标签: tsql optimization sql-server-2012