2008-12-12 9 views
1

J'ai une table pour laquelle je veux sélectionner les 5 lignes par une colonne A. Je veux aussi avoir une 6ème rangée intitulée "Autre" qui résume les valeurs dans colonne A pour tous sauf les 5 premières lignes.SQL Server 2005 - Sélectionnez le haut N plus "Autre"

Y at-il un moyen facile de faire cela? Je commence par:

select top 5 
    columnB, columnA 
from 
    someTable t 
order by 
    columnA desc 

Répondre

3

Non testé, mais essayer quelque chose comme ceci:

select * from (
    select top 5 
     columnB, columnA 
    from 
     someTable t 
    order by 
     columnA desc 
    union all 
    select 
     null, sum(columnA) 
    from 
     someTable t 
    where primaryKey not in (
     select top 5 
      primaryKey 
     from 
      someTable t 
     order by 
      columnA desc 
    ) 
) a 
+0

Remarque: Je n'ai pas explicitement additionné la colonne B car vous ne l'avez pas demandée. – RedFilter

0

Ceci est du haut de ma tête, et je garuntee horriblement efficace:

SELECT TOP 5 columnB, columnA 
FROM comTable t 
ORDER BY columnA desc 

UNION 

SELECT 'Other', (A.Sum - B.Sum) AS Summary 
FROM (SELECT SUM(columnA) FROM someTable) A 
JOIN (SELECT SUM(One) FROM 
    (SELECT TOP 5 columnA FROM someTable ORDER BY columnA DESC)) B 
0

J'ai récemment utilisé le SAUF statemnet beaucoup: (Non testé mais je donne un aller)

select top 5 
    columnB, columnA 
from 
    someTable t 
order by 
    columnA desc 
UNION ALL 
SELECT 'OTHER' ColumnB, SUM(ColumnA) 
FROM 
(SELECT ColumnB, ColumnA 
FROM someTable t 
EXCEPT 
select top 5 
    columnB, columnA 
from 
    someTable t 
order by 
    columnA desc 
) others 
1
select top 5 columnB, columnA 
from someTable 
order by columnA desc 

select SUM(columnA) as Total 
from someTable 

Effectuez la soustraction côté client.

1

100% non testé, et au large de ma tête, mais vous pouvez donner quelque chose comme ça. Si j'ai la chance de tester ce soir, je vais mettre à jour le poste, mais il y a une bouteille de vin ouvert pour le dîner et c'est vendredi soir ... :)

WITH CTE AS 
    (
    SELECT 
      ColumnB, 
      ColumnA, 
      ROW_NUMBER() OVER (ORDER BY ColumnB) AS RowNumber 
    FROM 
      dbo.SomeTable 
    ) 
SELECT 
     CASE WHEN RowNumber <= 5 THEN ColumnB ELSE 'Other' END AS ColumnB, 
     SUM(ColumnA) AS ColumnA 
FROM 
     CTE 
GROUP BY 
     CASE WHEN RowNumber <= 5 THEN ColumnB ELSE 'Other' END 
ORDER BY 
     MIN(RowNumber) 

EDIT: On dirait que cela a fonctionné après quelques erreurs de syntaxe idiotes. J'ai corrigé ceux-là, donc ça devrait fonctionner comme indiqué ci-dessus maintenant. Cependant, je ne peux pas parler de performances sur un grand ensemble de données, mais cela vaut la peine d'essayer.