2014-09-23 178 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