funcion - SQL Server: suma del extracto del caso
funcion avg en mysql (1)
Tengo la siguiente consulta anidada
select
sum(c.seats) as countPerfs, b.program, b.Prog_id
from
#LT_TEMP TableP
join
C_PROGRAM b on TableP.program_id = b.Prog_id
join
lt_data c on b.Program = c.program
join
LTR_BUDGET_REF a on TableP.program_id = a.ProgramID
where
a.Participants = ''Y''
and fyear = 2016
group by
b.Program, b.Prog_id
Devuelve una salida que se ve así:
program_id season program performance workshops artists_sess participants audience
6 2016 LU: NULL NULL NULL NULL NULL
7 2016 NC: NULL NULL NULL NULL NULL
11 2016 AC: NULL NULL NULL NULL NULL
12 2016 PD: NULL NULL NULL NULL NULL
19 2016 MC: NULL NULL NULL NULL NULL
Cada programa tiene una lógica diferente, por lo que si quiero calcular permite decir los participantes. Pero cuando el programa es MC, solo queremos devolver / sumar ciertos datos. Pero cuando el programa es LU, queremos calcular todos los datos. y así. ¿Cómo construyo esa declaración de caso?
por ejemplo, si el programa es MC, queremos sumar c.seats (de lt_data) pero solo donde el precio es = 800. Pero si el programa es LU, queremos sumar asientos para todos los precios. si el programa es PD queremos sumar donde el precio es 800, 500 y 300. Cosas como esa. Es caso por caso, pero no estoy seguro de cómo estructurarlo.
Gracias por adelantado.
Esta es la consulta completa
UPDATE
#LT_TEMP
SET
program = h.Program,
participants = h.countPerfs
FROM
(
select sum(c.seats) as countPerfs, b.program, b.Prog_id
from #LT_TEMP TableP
join C_PROGRAM b on TableP.program_id = b.Prog_id
join lt_data c on b.Program = c.program
join LTR_BUDGET_REF a on TableP.program_id = a.ProgramID
where a.Participants = ''Y''
and fyear = 2016
group by b.Program, b.Prog_id
) h
where h.Prog_id = #LT_TEMP.program_id
and h.Prog_id not in (27, 28, 29)
Creo que estás tratando de hacer tu agregación y la lógica CASE
a un nivel demasiado alto. Intente hacerlo en una subconsulta de lt_data agrupada por programa:
SELECT
c.Prog_id,
fyear AS season,
c.program,
SUM(l.seats) AS countPerfs
FROM
#LT_TEMP t JOIN
C_PROGRAM c ON
t.program_id = c.Prog_id JOIN
(SELECT
fyear,
program,
SUM(CASE
WHEN program = ''mc:'' AND price = 800 THEN seats
WHEN program = ''lu:'' THEN seats
WHEN program = ''pd:'' and price in (300, 500, 800) then seats
ELSE seats
END) AS calc
FROM
lt_data
GROUP BY
fyear, program) l ON
c.Program = l.program JOIN
LTR_BUDGET_REF b ON
TableP.program_id = b.ProgramID
WHERE
b.Participants = ''Y'' AND
fyear = @fyear
GROUP BY
c.Prog_id,
fyear,
c.Program
El ejemplo de sintaxis relevante en la definición de MS es: expresión CASE buscada:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END