【发布时间】:2008-12-12 21:59:25
【问题描述】:
我有一个表格,我想在 A 列中选择前 5 行。我还希望有一个标题为“其他”的第 6 行,它将 A 列中除前 5 行之外的所有值相加。
有没有简单的方法来做到这一点?我开始:
select top 5
columnB, columnA
from
someTable t
order by
columnA desc
【问题讨论】:
标签: sql sql-server
我有一个表格,我想在 A 列中选择前 5 行。我还希望有一个标题为“其他”的第 6 行,它将 A 列中除前 5 行之外的所有值相加。
有没有简单的方法来做到这一点?我开始:
select top 5
columnB, columnA
from
someTable t
order by
columnA desc
【问题讨论】:
标签: sql sql-server
未测试,但请尝试以下方法:
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
【讨论】:
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)
编辑:看起来这在几个愚蠢的语法错误之后有效。我已经更正了这些,所以它现在应该像上面列出的那样工作。虽然我不能谈论大型数据集的性能,但值得一试。
【讨论】:
这不是我的想法,我会保证非常高效:
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
【讨论】: