tsql - t-sql group by category and get top n values -


imagine have table:

month | person | value ---------------------- jan   | p1     | 1 jan   | p2     | 2 jan   | p3     | 3 feb   | p1     | 5 feb   | p2     | 4 feb   | p3     | 3 feb   | p4     | 2 ... 

how can build t-sql query top 2 value rows , third sum of others?

something this:

result:  month | person | value ---------------------- jan   | p3     | 3 jan   | p2     | 2 jan   | others | 1 -(sum of bottom value - in case (jan, p1, 1)) feb   | p1     | 5 feb   | p2     | 4 feb   | others | 5 -(sum of bottom values - in case (feb, p3, 3) , (feb, p4, 2)) 

thanks

in assumption using sql server 2005 or higher, using cte trick.

  • attach row_number each row, starting highest value, resetting each month.
  • select top 2 rows each month query (rownumber <= 2)
  • union remaining rows (rownumber > 2)

sql statement

;with months (month, person, value) (   select 'jan', 'p1', 1 union   select 'jan', 'p2', 2 union   select 'jan', 'p3', 3 union   select 'feb', 'p1', 5 union   select 'feb', 'p2', 4 union   select 'feb', 'p3', 3 union   select 'feb', 'p4', 2 ), q (   select  month           , person           , value           , rownumber = row_number() on (partition month order value desc)      months ) select  month         , person         , value    (                   select  month                   , person                   , value                   , rownumber              q             rownumber <= 2            union           select  month                   , person = 'others'                   , sum(value)                   , max(rownumber)              q             rownumber > 2                   group                   month          ) q                           order         month desc         , rownumber 

kudo's go andriy teaching me new tricks.


Comments

Popular posts from this blog

Javascript line number mapping -

c# - Is it possible to remove an existing registration from Autofac container builder? -

php - Mysql PK and FK char(36) vs int(10) -