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

Я не вижу другого способа сделать это. Если вы хотите повысить производительность, опубликуйте план запроса. –

+0

Запрос плана, как и в «плане выполнения», необходим для оптимизации с оптимизацией (файл .sqlplan как вложение лучше всего подходит IMO) –

+0

Поскольку Select COUNT (SZCUSTOMERNO) из dbo.COL_TRN_AGREEMENT - это статическое поле, которое не изменяется с каждой строкой, лучше объявить переменная для той, которая поможет в более быстром извлечении данных. – Azar

ответ

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 или предложением контекста отслеживания изменений, предыдущий оператор должен быть прерван точкой с запятой. ' –

+0

@AMS Проверьте это. http://sqlfiddle.com/#!3/1bc60/9 –

+0

Эй, теперь он не дает ошибки, но не дает точного вывода. Он дает дубликаты данных кода портфеля. –

Смежные вопросы