2014-09-23 165 views
-1

我知道这个问题在这里经常被问到,但我有一些不同的要求。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 

我得到这个输出

enter image description here

可以这样用简单的逻辑和更快的执行完成,或者这是最简单的方法。

+0

我没有看到任何其他方式来做到这一点。如果您想提高性能,请发布查询计划。 – 2014-09-23 04:33:28

+0

在“执行计划”中查询计划需要帮助进行优化(作为附件的.sqlplan文件是最好的IMO) – 2014-09-23 04:41:53

+0

由于dbo.COL_TRN_AGREEMENT中的COUNT(SZCUSTOMERNO)选择是不随每行更改的静态字段,所以最好声明一个这将有助于更快地检索数据。 – Azar 2014-09-23 04:43:47

回答

1

以下是一种方法,可能不会更快,但您仍然可以选择进行比较。

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 
+0

它不工作。给出此错误 '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

+0

@AMS检查它。 http://sqlfiddle.com/#!3/1bc60/9 – 2014-09-23 05:17:34

+0

嘿,它现在不给错误,但没有给出确切的输出。它提供重复的投资组合代码数据。 – 2014-09-23 05:24:32