Sql server SQL server:前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()

我有一个表,其中有合作伙伴父->合作伙伴->广告商,我正在寻找每个合作伙伴的前5名广告商,所有其他组将剩余销售额相加

到目前为止,我的代码是:

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