Sql server SQL server:前5名广告商&每个子组的所有其他广告商
我有一个表,其中有合作伙伴父->合作伙伴->广告商,我正在寻找每个合作伙伴的前5名广告商,所有其他组将剩余销售额相加 到目前为止,我的代码是:Sql server SQL server:前5名广告商&每个子组的所有其他广告商,sql-server,grouping,Sql Server,Grouping,我有一个表,其中有合作伙伴父->合作伙伴->广告商,我正在寻找每个合作伙伴的前5名广告商,所有其他组将剩余销售额相加 到目前为止,我的代码是: select [Partner Parent], [Partner], [Advertiser], [Revenue] from ( select [Partner Parent], [Partner], [Advertiser], [Revenue] = ISNULL(SUM([Revenue]), 0), rn = row_number()
select [Partner Parent], [Partner], [Advertiser], [Revenue]
from (
select [Partner Parent], [Partner], [Advertiser], [Revenue] = ISNULL(SUM([Revenue]), 0),
rn = row_number() over (partition by [Partner] order by ISNULL(SUM([Revenue]), 0) DESC)
from [table]
group by [Partner Parent], [Partner], [Advertiser]
) a where a.rn <= 5
建议?
谢谢
编辑:
样本数据:
| Partner Parent | Partner | Advertiser | Revenue |
|----------------|----------------|--------------------------|---------|
| Partner | Partner-Canada | Air Canada | 500 |
| Partner | Partner-Canada | Mazda Motor Corp | 400 |
| Partner | Partner-Canada | Ford Motors | 300 |
| Partner | Partner-Canada | Land Rover Motors | 200 |
| Partner | Partner-Canada | Kaspersky Anti-Virus | 100 |
| Partner | Partner-Canada | Jaguar | 10 |
| Partner | Partner-Canada | Delta Hotels and Resorts | 10 |
| Partner | Partner-Canada | Toronto Tourism | 10 |
| Partner | Partner-Canada | Yum Restaurants | 10 |
| Partner | Partner-Canada | Universal Studios | 10 |
| Partner | Partner-Norway | Manulife | 500 |
| Partner | Partner-Norway | CIBC | 400 |
| Partner | Partner-Norway | Pfizer Inc | 300 |
| Partner | Partner-Norway | TD Bank Group | 200 |
| Partner | Partner-Norway | General Electric | 100 |
| Partner | Partner-Norway | Tim Hortons | 10 |
| Partner | Partner-Norway | Universal Pictures | 10 |
| Partner | Partner-Norway | Dyson | 10 |
| Partner | Partner-Norway | Suncor Energy | 10 |
| Partner | Partner-Norway | Entertainment One | 10 |
输出应为:
| Partner Parent | Partner | Advertiser | Revenue |
|----------------|----------------|----------------------|---------|
| Partner | Partner-Canada | Air Canada | 500 |
| Partner | Partner-Canada | Mazda Motor Corp | 400 |
| Partner | Partner-Canada | Ford Motors | 300 |
| Partner | Partner-Canada | Land Rover Motors | 200 |
| Partner | Partner-Canada | Kaspersky Anti-Virus | 100 |
| Partner | Partner-Canada | All Other | 50 |
| Partner | Partner-Norway | Manulife | 500 |
| Partner | Partner-Norway | CIBC | 400 |
| Partner | Partner-Norway | Pfizer Inc | 300 |
| Partner | Partner-Norway | TD Bank Group | 200 |
| Partner | Partner-Norway | General Electric | 100 |
| Partner | Partner-Norway | All Other | 50 |
等等。您可以使用行数和总和来获得所有其他值:
请提供样品数据和预期结果。SQL Fiddle会很好。这有帮助吗?很抱歉还是新手this@sweetpete,没问题!很高兴我能帮上忙。我怀疑如果任何合作伙伴的广告客户少于5个,那么会有问题,OP是否希望出现“所有其他”行?@AaronBertrand,如果广告客户少于5个,我不需要“所有其他”行
| Partner Parent | Partner | Advertiser | Revenue |
|----------------|----------------|----------------------|---------|
| Partner | Partner-Canada | Air Canada | 500 |
| Partner | Partner-Canada | Mazda Motor Corp | 400 |
| Partner | Partner-Canada | Ford Motors | 300 |
| Partner | Partner-Canada | Land Rover Motors | 200 |
| Partner | Partner-Canada | Kaspersky Anti-Virus | 100 |
| Partner | Partner-Canada | All Other | 50 |
| Partner | Partner-Norway | Manulife | 500 |
| Partner | Partner-Norway | CIBC | 400 |
| Partner | Partner-Norway | Pfizer Inc | 300 |
| Partner | Partner-Norway | TD Bank Group | 200 |
| Partner | Partner-Norway | General Electric | 100 |
| Partner | Partner-Norway | All Other | 50 |
;WITH Cte AS(
SELECT *,
RN = ROW_NUMBER() OVER(PARTITION BY [Partner Parent], Partner ORDER BY Revenue DESC)
FROM [table]
)
SELECT *
FROM(
SELECT
[Partner Parent],
Partner,
Advertiser,
Revenue
FROM Cte
WHERE RN <= 5
UNION ALL
SELECT
[Partner Parent],
Partner,
Advertiser = 'All Other',
Revenue = SUM(Revenue)
FROM Cte
WHERE RN > 5
GROUP BY
[Partner Parent], Partner
)t
ORDER BY
[Partner Parent],
Partner,
CASE
WHEN Advertiser = 'All Other' THEN NULL
ELSE Revenue
END DESC