SQL Server 2008 R2中的查询优化
我知道这个问题在这里经常被问到,但我有一些不同的要求。SQL Server 2008 R2中的查询优化
我想得到这个输出。我也在用我的逻辑解决这个问题,但是这可以通过更简单和优化的方式来完成。更快地运行此查询。
这里是我的查询:
select
ISNULL('PortFolio Code: '+a.CPORTFOLIOCODE,'Grand Total') as [PortFolio Code],
COUNT(SZCUSTOMERNO) as [Accounts],
CAST(COUNT(SZCUSTOMERNO) * 100/(Select COUNT(SZCUSTOMERNO)
from dbo.COL_TRN_AGREEMENT)
as nvarchar(50))+' %' as [%],
sum(case when a.SZBUCKETCODE =1 then a.FOSAMT else 0 end) as [Bucket :1],
sum(case when a.SZBUCKETCODE =2 then a.FOSAMT else 0 end) as [Bucket :2],
sum(case when a.SZBUCKETCODE =3 then a.FOSAMT else 0 end) as [Bucket :3],
sum(a.FOSAMT) as [All Buckets]
from
dbo.COL_TRN_AGREEMENT a
group by
a.CPORTFOLIOCODE with rollup
我得到这个输出
可以这样用简单的逻辑和更快的执行完成,或者这是最简单的方法。
以下是一种方法,可能不会更快,但您仍然可以选择进行比较。
declare @cnt int
Select @cnt = COUNT(SZCUSTOMERNO) from dbo.COL_TRN_AGREEMENT
;with
matrix (SZBUCKETCODE,Bucket_1,Bucket_2,Bucket_3) as
(select 1,1,0,0 union
select 2,0,1,0 union
select 3,0,0,1)
select isnull('PortFolio Code: '+a.CPORTFOLIOCODE,'Grand Total') as [PortFolio Code],
COUNT(SZCUSTOMERNO) as [Accounts],
cast(COUNT(SZCUSTOMERNO)*100/@cnt as nvarchar(50))+' %' as [%],
sum(a.FOSAMT*m.Bucket_1) as [Bucket :1],
sum(a.FOSAMT*m.Bucket_2) as [Bucket :2],
sum(a.FOSAMT*m.Bucket_3) as [Bucket :3],
sum(a.FOSAMT) as [All Buckets]
from dbo.COL_TRN_AGREEMENT a
join matrix m
on m.SZBUCKETCODE = a.SZBUCKETCODE
group by a.CPORTFOLIOCODE with rollup
它不工作。给出此错误 'Msg 156,Level 15,State 1,Line 18 关键字'group'附近的语法错误。 Msg 319,Level 15,State 1,Line 18 关键字'with'附近的语法不正确。如果这个语句是一个公用表表达式,一个xmlnamespaces子句或一个变更跟踪上下文子句,则前面的语句必须以分号结束。 – 2014-09-23 05:01:01
@AMS检查它。 http://sqlfiddle.com/#!3/1bc60/9 – 2014-09-23 05:17:34
嘿,它现在不给错误,但没有给出确切的输出。它提供重复的投资组合代码数据。 – 2014-09-23 05:24:32
我没有看到任何其他方式来做到这一点。如果您想提高性能,请发布查询计划。 – 2014-09-23 04:33:28
在“执行计划”中查询计划需要帮助进行优化(作为附件的.sqlplan文件是最好的IMO) – 2014-09-23 04:41:53
由于dbo.COL_TRN_AGREEMENT中的COUNT(SZCUSTOMERNO)选择是不随每行更改的静态字段,所以最好声明一个这将有助于更快地检索数据。 – Azar 2014-09-23 04:43:47