0

Je crée des rapports pour une application devant être utilisée par différents états. La base de données a le potentiel d'être très grande. Je voudrais savoir quel est le meilleur moyen d'obtenir les totaux des colonnes.Méthode la plus optimisée pour obtenir des totaux de colonnes dans SQL Server 2005+

Actuellement, j'ai SQL similaire à ce qui suit:

SELECT count(case when prg.prefix_id = 1 then iss.id end) + 
     count(case when prg.prefix_id = 2 then iss.id end) as total, 
     count(case when prg.prefix_id = 1 then iss.id end) as c1, 
     count(case when prg.prefix_id = 2 then iss.id end) as c2 
FROM dbo.TableName 
WHERE ... 

Comme vous pouvez le voir, les colonnes sont là deux fois. Dans un cas, je les ajoute et montre le total, dans l'autre je montre juste les valeurs individuelles qui sont requises pour le rapport.

Ceci est un très petit échantillon du SQL, il y a 20 + colonnes et w/i ces colonnes 4 ou plus d'entre eux sont sommés à la fois.

Je pensais à déclarer certains paramètres @ et la mise en chacune des colonnes égales à un @parameter, alors je pourrais simplement ajouter que jamais je devais paramètres @ montrer les totaux des colonnes, IE: SET @Total = @c1 + @c2

Mais , est-ce que le moteur SQL Server prend garde que les colonnes soient là plusieurs fois comme ça? Existe-t-il une meilleure façon de le faire?

Répondre

2

Quel est le motif cela ne se fait pas comme

select prg.prefix_id, count(1) from tablename where... group by prg.prefix_id  

Il vous laisse avec un jeu de résultats de la prefix_id et le nombre de lignes pour chaque prefix_ID ... pourrait être préférentiel sur une série de comptage (cas), et je pense que cela devrait être plus rapide, mais je ne peux pas confirmer à coup sûr.

J'utiliserais une sous-requête avant d'avoir moi-même recours à @vars. Quelque chose comme ceci:

select c1,c2,c1+c1 as total from 
    (SELECT 
    count(case when prg.prefix_id = 1 then iss.id end) as c1, 
    count(case when prg.prefix_id = 2 then iss.id end) as c2 
    FROM dbo.TableName 
    WHERE ...) a 
+0

Je ne peux pas utiliser la première option parce que l'instruction CASE à l'intérieur du COUNT est un peu plus compliqué que vous ne le voyez réellement. Je pense que je vais essayer une variante de ce que vous et l'autre posté suggéré. Plutôt qu'une vue en ligne, utilisez un CTE. Je ne sais pas si cela fera une différence. –

+0

Quelle que soit la complexité de l'instruction case, je préférerais avoir des résultats en tant que colonne (s) d'ID, comptez. Une déclaration de cas plus compliquée aurait juste plus de colonnes d'identification. Transformez cette déclaration de compte en une sous-requête, puis sélectionnez dans la sous-requête si nécessaire, par exemple en joignant la sous-requête à elle-même pour présenter les résultats comme vous le souhaitez. Probablement juste mon préf ... sélectionner l'ID, la colonne (s) est préférentielle sur select column_where_id = 1, column_where_id = 2, column_where_id = etc ... – Twelfth

1

Utilisez un code SQL si vous le pouvez avant de recourir à la procédure T-SQL. Règle de base si vous pouvez le faire dans SQL le faire en SQL. Si vous souhaitez émuler des valeurs statiques avec SQL droite tentent une vue en ligne comme celui-ci:

SELECT iv1.c1 + iv1.c2 as total, 
     iv1.c1, 
     iv1.c2 
    FROM 
    (
    SELECT count(case when prg.prefix_id = 1 then iss.id end) as c1, 
      count(case when prg.prefix_id = 2 then iss.id end) as c2 
    FROM dbo.TableName 
    WHERE ... 
    ) AS iv1 

De cette façon, vous obtenez logiquement les comptes une fois et peut calculer des valeurs basées sur ces chefs d'accusation. Cependant, je pense que SQL Server est assez intelligent pour ne pas avoir à scanner le nombre de fois, donc je ne sais pas si votre plan serait différent du SQL que j'ai envoyé et le SQL que vous avez.

+0

SQL exécutera toujours la logique de procédure. – Kuberchaun

+0

Sauf si vous travaillez avec un jeu de données 1 rangée;) Je me demande si je devrais mettre des balises [badjoke] [/ badjoke] sur ce commentaire – Twelfth

Questions connexes