Group by parcial

02/11/2008 - 12:30 por Sebastián Gómez | Informe spam
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

Preguntas similare

Leer las respuestas

#1 Pedro
02/11/2008 - 22:15 | Informe spam
Yo lo haría sin la unión debido a que sólo habría una sola pasada a la tabla
pero creo que todo dependería de la cantidad de registros que deban ser
resumidos.

"Sebastián Gómez" escribió en el mensaje
news:
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



Respuesta Responder a este mensaje
#2 Sebastián Gómez
03/11/2008 - 12:47 | Informe spam
Sí. De hecho he estado haciendo pruebas y parece mejor no complicarlo con
la union.
thks

"Pedro" escribió en el mensaje
news:%
Yo lo haría sin la unión debido a que sólo habría una sola pasada a la
tabla pero creo que todo dependería de la cantidad de registros que deban
ser resumidos.

"Sebastián Gómez" escribió en el mensaje
news:
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







Respuesta Responder a este mensaje
#3 Jose TH
03/11/2008 - 14:56 | Informe spam
Si es muy frecuente sacar valores anualizados mejor te haces una vista
indexada.

Jose TH


"Sebastián Gómez" wrote in message
news:

Sí. De hecho he estado haciendo pruebas y parece mejor no complicarlo con
la union.
thks

"Pedro" escribió en el mensaje
news:%
Yo lo haría sin la unión debido a que sólo habría una sola pasada a la
tabla pero creo que todo dependería de la cantidad de registros que deban
ser resumidos.

"Sebastián Gómez" escribió en el mensaje
news:
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











email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida