Esto está relacionado con otra pregunta obtener el primero registro en grupo por resultado basado en condición para que quede claro, empezaré desde el principio esta es mi estructura de base de datos crear base de datos testGroupfirst; Vamos

use testGroupfirst;
go

create table testTbl (

id int primary key identity,name nvarchar(50) ,year int ,degree int , place  nvarchar(50)

)

insert into testTbl values ('jack',2015,50,'giza')
insert into testTbl values ('jack',2016,500,'cai')
insert into testTbl values ('jack',2017,660,'alex')
insert into testTbl values ('jack',2018,666,'giza')
insert into testTbl values ('jack',2011,50,'alex')
insert into testTbl values ('rami',2015,5054,'giza')
insert into testTbl values ('rami',2016,1500,'cai')
insert into testTbl values ('rami',2017,66220,'giza')
insert into testTbl values ('rami',2018,6656,'alex')
insert into testTbl values ('rami',2011,540,'cai')
insert into testTbl values ('jack',2010,50,'cai')
select * from testTbl

Este es el resultado hasta ahora ingrese la descripción de la imagen aquí

Para obtener los últimos 2 pedidos, etc. de un grupo, esto podría resolverse con este código

SELECT name, year, degree, place
FROM 
(SELECT name,degree, year,  place,
    ROW_NUMBER() OVER (PARTITION BY name ORDER BY degree desc) rn
     FROM testTbl   
) t    
WHERE rn in(1,2,3);

--another way
select t.* 
from testTbl t
    cross apply (select top 2 id from testTbl t2 where t2.name = t.name order by degree desc) r
where t.id = r.id

Necesito obtener una función agregada como sum para obtener la suma de todos los elementos relacionados en un grupo, hago un código como este

select t.*, sum (t.degree) as sumtest 
from testTbl t  
    cross apply (select top 2 id ,degree  , sum (degree) as sumtest from testTbl t2 where t2.place = t.place group by id,degree order by degree  ) r
where t.id = r.id group by t.id,t.name,t.place,t.year,t.degree

Pero no funcionó como pensaba, ya que necesito hacer que el valor agregado no sea escalar para cada elemento en sí, necesito obtener la suma de todos los elementos en un grupo lo que necesito es lo que se muestra en esta foto ingrese la descripción de la imagen aquí

0
user4833581 15 nov. 2017 a las 17:38

2 respuestas

La mejor respuesta

Utilice otra función de ventana:

    SELECT name, year, degree, place, sum(degree) over (partition by name) as [sum]
    FROM 
    (SELECT name,degree, year,  place,
        ROW_NUMBER() OVER (PARTITION BY name ORDER BY degree desc) rn
         FROM #testTbl   
    ) t  
    WHERE rn in(1,2,3);
2
cloudsafe 15 nov. 2017 a las 14:52

Este podría ser un enfoque

  select 
  name,
  SUM(degree) sumtest 
  into #test
  from testTbl 
  group by name

  select b.*, a.sumtest from #test a 
  join
  testTbl b on b.name = a.name
0
Christian Bawman 15 nov. 2017 a las 14:57