Tengo una tabla de transacciones contables
TransaccionContable
Tipo, IDtran, fecha, cuenta, debe, haber
y
Tipos
Tipo, descripcion, ResumirAnual,
necesito sacar en una consulta los movimientos para un rango de fechas dado
pero que los que tengan Tipos.ResumirAnual en 1 salgan resumidos en la
consulta. Para los resumidos: IDTran (debe poner el año (nunca coincide con
un IDtran real ya que este contiene CHAR(6) posiciones completadas con
ceros)) y la fecha debe tomarse como la ultima de ese año (para esto uso una
funcion dbo.ultimafechaano que me da eso).
Lo voy pensando asi, hasta ahora :
SELECT
A.Tipo,
(case when Tipos.ResumirAnual=1 then dbo.ultimafechaano(fecha) else fecha,
end) as fecha,
(case when Tipos.ResumirAnual=1 then convert(char(4),year(fecha)) else
IDtran end) as IDtran,
cuenta,
sum(debe) as debe,
sum(haber) as haber,
FROM TransaccionContable A
INNER JOIN Tipos on A.Tipo=Tipos.Tipo
WHERE fecha>=@fecha and fecha<@fecha+1
GROUP BY
A.Tipo,
(case when Tipos.ResumirAnual=1 then dbo.ultimafechaano(fecha) else fecha,
end),
(case when Tipos.ResumirAnual=1 then convert(char(4),year(fecha)) else
IDtran end) ,
cuenta
Pero como creo que podrian haber muchisimos registros (millones) pregunto si
habria una forma mas "|eficiente" o si seria preferible dividirla en dos
con una union all (sacando los individuales por un lado y los resumidos por
otro y luego juntarlos):
SELECT
A.Tipo,
fecha,
IDtran,
cuenta,
debe,
haber,
FROM TransaccionContable A
INNER JOIN Tipos on A.Tipo=Tipos.Tipo
WHERE fecha>=@fecha and fecha<@fecha+1 AND Tipos.ResumirAnual<>1
UNION ALL
SELECT
A.Tipo,
dbo.ultimafechaano(fecha) as fecha,
convert(char(4),year(fecha)) as IDtran,
cuenta,
sum(debe) as debe,
sum(haber) as haber,
FROM TransaccionContable A
INNER JOIN Tipos on A.Tipo=Tipos.Tipo
WHERE fecha>=@fecha and fecha<@fecha+1 AND Tipos.ResumirAnual=1
GROUP BY
A.Tipo,
dbo.ultimafechaano(fecha),
convert(char(4),year(fecha)),
cuenta
Cualquier orientacion les agradezco
Leer las respuestas