sql - row_number - sum over
Seleccione el caso con "sobre la particiĆ³n por" (2)
¿Cuál es la sintaxis correcta o es posible usar mayúsculas / minúsculas en una partición de selección y en ella? (usando el servidor sql 2012)
a = unique id
b = a string''xf%''
c = values
d = values
e = values
select
case
when b like ''xf%'' then
(sum(c*e)/100*3423 over (partition by a))end as sumProduct
from #myTable
esto es algo que tengo que resolver, que es parte de un problema que tuve anteriormente SumProduct en sql
editar : previa solicitud, agregar algunos datos de muestra y el resultado esperado crear la tabla #testing (b varchar (20), una fecha, c int, e int)
b a c e sumProduct (expected)
xf1m 2015.03.02 1 3 (1*3 + 2*5 + 4*2 +3*6)*100/3423
xf3m 2015.03.02 2 5 (1*3 + 2*5 + 4*2 +3*6)/100*3423
xf5y 2015.03.02 4 2 (1*3 + 2*5 + 4*2 +3*6)/100*3423
xf10y 2015.03.02 3 6 (1*3 + 2*5 + 4*2 +3*6)/100*3423
adfe 2015.03.02 2 5 ---this is skipped because is not xf%
xf1m 2013.02.01 7 2 (7*2 + 1*8 + 10*1)/100*3423
xf15y 2013.02.01 1 8 (7*2 + 1*8 + 10*1)/100*3423
xf20y 2013.02.01 10 1 (7*2 + 1*8 + 10*1)/100*3423
Vi que el problema es este: se están sumando cosas incluso si no corresponden a los criterios. En mi violín, puedes ver que el resultado de sumProduct es 49 en lugar de 39 porque se están agregando 2 * 5 de Adfe. ¿Qué puedo hacer al respecto?
create table #testing (b varchar (20), a date, c int, e int)
insert into #testing (b,a,c,e)
values
(''xf1m'',''2015-03-02'',''1'',''3''),
(''xf3m'',''2015-03-02'',''2'',''5''),
(''xf5y'',''2015-03-02'',''4'',''2''),
(''xf10y'',''2015-03-02'',''3'',''6''),
(''adfe'',''2015-03-02'',''2'',''5''),
(''xf1m'',''2013-02-01'',''7'',''2''),
(''xf15y'',''2013-02-01'',''1'',''8''),
(''xf20y'',''2013-02-01'',''10'',''1'')
editar: encontró la solución, la escribió como respuesta a continuación
Encontré la solución para lo que estaba pidiendo en mi edición:
select
b,
a,
c,
e,
case
when b like ''xf%'' then --
(sum(c * e) over (partition by a ))/*/3*10*/ end as sumProduct
into #testing2
from #testing
where (b like ''xf%'')
select t1.b, t1.a,t1.c,t1.e,t2.sumProduct
from #testing t1
left join #testing2 t2 on t1.a = t2.a and t2.b = t1.b
order by t1.a, t1.b
No puede poner expresiones arbitrarias dentro de la expresión Aggregate() OVER (PARTITION clause)
, así que mueva los cálculos adicionales al exterior:
select
case
when b like ''xf%'' then
(sum(c*e) over (partition by a))/100*3423 end as sumProduct
from #myTable