我有一个表,我想选择顶部5行由列A顶部。我也想有一个第6行标题为“其他”,它将值除了前5行以外的所有列。SQL Server 2005 - 选择顶部N加“其他”
有没有简单的方法来做到这一点?我开始有:
select top 5
columnB, columnA
from
someTable t
order by
columnA desc
我有一个表,我想选择顶部5行由列A顶部。我也想有一个第6行标题为“其他”,它将值除了前5行以外的所有列。SQL Server 2005 - 选择顶部N加“其他”
有没有简单的方法来做到这一点?我开始有:
select top 5
columnB, columnA
from
someTable t
order by
columnA desc
没有测试,但尝试这样的事:
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
这是从我的头顶,我会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
我最近很多地方使用了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
select top 5 columnB, columnA
from someTable
order by columnA desc
select SUM(columnA) as Total
from someTable
在客户端做减法。
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)
编辑:看起来这几个工作后,愚蠢的语法错误。我已经纠正了这些问题,所以应该按照上面列出的那样工作。尽管我不能在大型数据集上表现,但值得一试。
注:我明确没有总结columnB,因为你没有要求。 – RedFilter 2008-12-12 22:07:18