Sql 对前十名供应商进行排序,并将剩余供应商显示为“其他” 请考虑一个有两栏的供应商:供应商名称和付款金额< /P>

Sql 对前十名供应商进行排序,并将剩余供应商显示为“其他” 请考虑一个有两栏的供应商:供应商名称和付款金额< /P>,sql,sql-server,Sql,Sql Server,我正在寻找一个查询,它返回前十名供应商,按PayableAmpount降序和第11行中其他应付金额的总和排序 显然,Vendors表中的payablemount之和应该等于Query中的payablemount之和。这将执行您要查找的查询。首先提取前10名中的供应商,然后将结果与排名较高的供应商合并,但将其称为“其他” 这已经在SQLFIDLE中进行了测试。这是针对第11行的 我没有检查 declare @i int set @i= (select sum(x.PayableAmount) fr

我正在寻找一个查询,它返回前十名供应商,按PayableAmpount降序和第11行中其他应付金额的总和排序


显然,Vendors表中的payablemount之和应该等于Query中的payablemount之和。

这将执行您要查找的查询。首先提取前10名中的供应商,然后将结果与排名较高的供应商合并,但将其称为“其他”


这已经在SQLFIDLE中进行了测试。

这是针对第11行的

我没有检查

declare @i int
set @i=
(select sum(x.PayableAmount)
from
(select * from table
except
select top 10 *from table
order by PayableAmount desc) as x)

select 'another',@i

从技术上讲,可以在一个查询中执行以下操作:

declare @t table (
    Name varchar(50) primary key,
    Amount money not null
);

-- Dummy data
insert into @t (Name, Amount)
select top (20) sq.*
from (
select name, max(number) as [Amount]
from master.dbo.spt_values
where number between 100 and 100000
    and name is not null
group by name
) sq
order by newid();

-- The table itself, for verification
select * from @t order by Amount desc;

-- Actual query
select top (11)
    case when sq.RN > 10 then '<All others>' else sq.Name end as [VendorName],
    case
        when sq.RN > 10 then sum(sq.Amount) over(partition by case when sq.rn > 10 then 1 else 0 end)
        else sq.Amount
    end as [Value]
from (
    select t.Name, t.Amount, row_number() over(order by t.Amount desc) as [RN]
    from @t t
    ) sq
order by sq.RN;

从2005年开始,它甚至可以在任何SQLServer版本上运行。但是,在现实生活中,我更愿意分别计算这两个部分,然后将它们合并。

如果我们能看到您先尝试了什么,那就太好了。我执行了这个。另一行不是第11行,因为它,金额大于我表中的第9和第10个供应商。请尝试在末尾按PayableMount DESC排序。另一行的PayableMount不是最小金额。所以我们不能这样做。编辑后,现在使用列RN对数据进行排序
declare @t table (
    Name varchar(50) primary key,
    Amount money not null
);

-- Dummy data
insert into @t (Name, Amount)
select top (20) sq.*
from (
select name, max(number) as [Amount]
from master.dbo.spt_values
where number between 100 and 100000
    and name is not null
group by name
) sq
order by newid();

-- The table itself, for verification
select * from @t order by Amount desc;

-- Actual query
select top (11)
    case when sq.RN > 10 then '<All others>' else sq.Name end as [VendorName],
    case
        when sq.RN > 10 then sum(sq.Amount) over(partition by case when sq.rn > 10 then 1 else 0 end)
        else sq.Amount
    end as [Value]
from (
    select t.Name, t.Amount, row_number() over(order by t.Amount desc) as [RN]
    from @t t
    ) sq
order by sq.RN;