2013-03-28 5 views
1

Я ищу более элегантное (возможно, более быстрое) решение моего затруднительного положения.TSQL выбрать из другой таблицы в другом месте где

У меня есть следующий запрос для получения отчета о таблице трафика вызовов:

SELECT 'Tariff1' as [Tariff], Count([Number]) as [Number of calls] ,sum(convert(bigint,[Seconds]))/60 as [Minutes], sum([CustomerCost]) as [Customer Cost], sum([WholesaleCost]) as [WholesaleCost] 
    FROM [MarchCalls] 
where [AccNo] in (select [accno] from [Tariffs] where [Tariff] = 'Tariff1') 

union 

SELECT 'Tariff2' as [Tariff], Count([Number]) as [Number of calls] ,sum(convert(bigint,[Seconds]))/60 as [Minutes], sum([CustomerCost]) as [Customer Cost], sum([WholesaleCost]) as [WholesaleCost] 
    FROM [MarchCalls] 
where [AccNo] in (select [accno] from [Tariffs] where [Tariff] = 'Tariff2') 

union 
SELECT 'Tariff3' as [Tariff], Count([Number]) as [Number of calls] ,sum(convert(bigint,[Seconds]))/60 as [Minutes], sum([CustomerCost]) as [Customer Cost], sum([WholesaleCost]) as [WholesaleCost] 
    FROM [MarchCalls] 
where [AccNo] in (select [accno] from [Tariffs] where [Tariff] = 'Tariff3') 

union 

SELECT 'Total' as [Tariff], Count([Number]) as [Number of calls] ,sum(convert(bigint,[Seconds]))/60 as [Minutes], sum([CustomerCost]) as [Customer Cost], sum([WholesaleCost]) as [WholesaleCost] 
    FROM [MarchCalls] 

Пар точек: Convert (BIGINT) необходим из-за объем записей и номер в нем В вернулся записей должен оставаться в этом формате Эти данные (и базы данных) строго только чтение SQL Server 2012

Этот запрос занимает больше времени в конце каждого месяца, и мне нужно, чтобы получить время вниз

Может ли кто-нибудь помочь мне рационализировать это?

+0

изменения союза в союз все – SQLMenace

ответ

4

Вместо того, с помощью IN, вы можете присоединиться на поле AccNo:

SELECT 
    T.[Tariff], 
    Count([Number]) as [Number of calls] , 
    sum(convert(bigint, [Seconds]))/60 as [Minutes], 
    sum([CustomerCost]) as [Customer Cost], 
    sum([WholesaleCost]) as  [WholesaleCost] 
FROM [MarchCalls] M 
inner join [Tarrifs] T on M.AccNo=T.Accno and [Tariff] in ('Tariff1','Tariff2', 'Tariff3') 
group by [Tariff] with ROLLUP 
+0

На самом деле, вы можете уменьшить первые три вниз на один запрос, отредактированный выше –

+1

Не забудьте изменить свой первый столбец на T. [Tariff] –

+0

Это намного быстрее, и ROLLUP решил проблему, с которой я столкнулся с итогами в объединениях. Спасибо, парни – JohnHC

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