Suppose I have 2 columns NAME and COUNT.
| NAME | COUNT |
|---|---|
| a1 | 2 |
| a2 | 4 |
| a3 | 5 |
| a4 | 1 |
| a5 | 6 |
| a6 | 2 |
| a7 | 4 |
| a8 | 6 |
| a9 | 7 |
| a10 | 4 |
| a11 | 1 |
I want to select first 5 records and group the rest others as one record( naming that record as others)
The output I need is
| NAME | COUNT |
|---|---|
| a1 | 2 |
| a2 | 4 |
| a3 | 5 |
| a4 | 1 |
| a5 | 6 |
| others | 24 |
In others I need sum of all the count values excluding first 5 records.
CodePudding user response:
We can use a union approach with the help of ROW_NUMBER():
WITH cte AS (
SELECT t.*, ROW_NUMBER() OVER (ORDER BY NAME) rn
FROM yourTable t
)
SELECT NAME, COUNT
FROM
(
SELECT NAME, COUNT, 1 AS pos FROM cte WHERE rn <= 5
UNION ALL
SELECT 'others', SUM(COUNT), 2 FROM cte WHERE rn > 5
) t
ORDER BY pos, NAME;
