Извлечение первых 10 строк и суммирование всех остальных в ряду 11 - PullRequest
5 голосов
/ 08 апреля 2010

У меня есть следующий запрос, который возвращает количество пользователей в стране;

SELECT C.CountryID AS CountryID, 
       C.CountryName AS Country, 
       Count(FirstName) AS Origin
FROM Users AS U
INNER JOIN Country AS C ON C.CountryID = U.CountryOfOrgin
GROUP BY CASE C.CountryName, 
              C.CountryID

Мне нужен способ получить топ-10, а затем собрать всех остальных пользователей в один ряд. Я знаю, как получить топ-10, но я застрял на получении остальных в одном ряду. Есть ли простой способ сделать это?

Например, если вышеуказанный запрос возвращает 17 записей, отображаются первые десять, а в строке 11 должна отображаться сумма пользователей из 7 оставшихся стран. В этой строке 11 countryid будет 0, а название страны Others* 1007. *

Спасибо за вашу помощь!

Ответы [ 2 ]

12 голосов
/ 08 апреля 2010

Вы не указали, как вы ранжируете топ-10, так что я предполагаю, что самые высокие показатели оцениваются выше?

With TopItems As
    (
    SELECT C.CountryID AS CountryID
            , C.CountryName AS Country
            , Count(FirstName) AS Origin
            , ROW_NUMBER() OVER( ORDER BY Count(FirstName) DESC ) As Num
    FROM Users AS U
        JOIN Country AS C 
            ON C.CountryID = U.CountryOfOrgin
    GROUP BY C.CountryName, C.CountryID
    )
Select CountryId, Country, Origin
From TopItems
Where Num <= 10
Union ALL
Select 0, 'Others', Sum(Origin)
From TopItems
Where Num > 10
0 голосов
/ 08 апреля 2010

Примерно так:

SELECT
    -- show them
    ROW_NUMBER() OVER (ORDER BY CASE WHEN country_code = 'Others' THEN 1 ELSE 0 END, SUM(n) DESC) AS nr,
    countryID,
    SUM(n)
FROM (
    -- change name for some countries
    SELECT
        CASE WHEN nr >= 11 THEN 'Others' ELSE countryID END AS countryID,
        n
    -- select all countries
    FROM ( 
        SELECT 
                    -- store number to recognize position
            ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) AS nr, 
            countries.countryID,
            COUNT(*) AS n
        FROM
            countries WITH (NOLOCK)
            JOIN
                users WITH (NOLOCK)
            ON
                users.countryID = countries.countryID
        GROUP BY
            countries.countryID
    ) AS x
) AS y
GROUP BY
    countryID
ORDER BY
    -- show Others as last one
    CASE WHEN countryID = 'Others' THEN 1 ELSE 0 END,
    SUM(n) DESC

у меня работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...