2013-03-28 2 views
1

Je suis à la recherche d'une solution plus élégante (peut-être plus rapide) à ma situation difficile.TSQL sélectionnez à partir d'une autre table dans l'où

J'ai la requête suivante pour produire un rapport sur une table de trafic d'appel:

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] 

Quelques points: Convert (bigint) est nécessaire en raison du volume des dossiers et les chiffres qui y sont Les retour recordset doit rester dans ce format Ces données (et base de données) est strictement en lecture seule SQL server 2012

cette requête prend plus de temps vers la fin de chaque mois et je dois obtenir le temps d'arrêt

Quelqu'un peut-il m'aider à rationaliser cela?

+0

union changement à l'union tout – SQLMenace

Répondre

4

Plutôt que d'utiliser un IN, peut vous rejoindre sur le terrain 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

En fait, vous pouvez réduire les trois premiers à une seule requête, édité ci-dessus –

+1

Ne pas oublier pour changer votre première colonne à T. [Tarif] –

+0

C'est beaucoup plus rapide, et le ROLLUP a résolu le problème que j'avais avec les totaux dans les jointures. Merci les gars – JohnHC

Questions connexes