2008-12-12 38 views
1

我有一个表,我想选择顶部5行由列A顶部。我也想有一个第6行标题为“其他”,它将值除了前5行以外的所有列。SQL Server 2005 - 选择顶部N加“其他”

有没有简单的方法来做到这一点?我开始有:

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

回答

3

没有测试,但尝试这样的事:

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

注:我明确没有总结columnB,因为你没有要求。 – RedFilter 2008-12-12 22:07:18

0

这是从我的头顶,我会garuntee可怕高效:

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

我最近很多地方使用了EXCEPT statemnet:(未测试,但我给它去了)

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 

在客户端做减法。

1

100%未经测试,并且不在我的头顶,但您可以提供类似这样的东西。如果我有机会测试今晚我会更新帖子,但有一瓶酒晚餐,这是星期五晚上... :)

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) 

编辑:看起来这几个工作后,愚蠢的语法错误。我已经纠正了这些问题,所以应该按照上面列出的那样工作。尽管我不能在大型数据集上表现,但值得一试。