Ayuda con un Select que parecia sencillo

28/01/2010 - 19:05 por Samuel SMH | Informe spam
Hola foro:
tengo lo siguiente
semestre cuota recibo monto fecha
20092596 1 20030750033 348.50 2009-08-31
20092596 1 0720248949 229.50 2009-08-31
20091000 2 0011111111 100.00 2009-11-15
20091000 2 0022222222 80.00 2009-11-10

deseo obtener el primer registro de cada cuota sumando Monto;
y conservar todas las columnas;
Asi:
semestre cuota recibo monto fecha
20092596 1 20030750033 578.00 2009-08-31
20091000 2 0011111111 180.00 2009-11-15

Gracias por la ayuda

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
28/01/2010 - 19:24 | Informe spam
Samuel,

Cual version de SS usas?

En las versiones 2005 / 2008, puedes hacer uso de las funciones de rango y
la clausula OVER.

DECLARE @T TABLE (
semestre int,
cuota int,
recibo varchar(15),
monto money,
fecha datetime
);

INSERT INTO @T VALUES(20092596, 1, '20030750033', 348.50, '2009-08-31');
INSERT INTO @T VALUES(20092596, 1, '0720248949', 229.50, '2009-08-31');
INSERT INTO @T VALUES(20091000, 2, '0011111111', 100.00, '2009-11-15');
INSERT INTO @T VALUES(20091000, 2, '0022222222', 80.00, '2009-11-10');

;WITH r_set AS (
SELECT
semestre,
cuota,
recibo,
monto,
fecha,
ROW_NUMBER() OVER(PARTITION BY semestre, cuota ORDER BY fecha) AS rn,
SUM(monto) OVER(PARTITION BY semestre, cuota) AS sum_monto
FROM
@T
)
SELECT
semestre,
cuota,
recibo,
sum_monto,
fecha
FROM
r_set
WHERE
rn = 1;
GO


AMB




"Samuel SMH" wrote:

Hola foro:
tengo lo siguiente
semestre cuota recibo monto fecha
20092596 1 20030750033 348.50 2009-08-31
20092596 1 0720248949 229.50 2009-08-31
20091000 2 0011111111 100.00 2009-11-15
20091000 2 0022222222 80.00 2009-11-10

deseo obtener el primer registro de cada cuota sumando Monto;
y conservar todas las columnas;
Asi:
semestre cuota recibo monto fecha
20092596 1 20030750033 578.00 2009-08-31
20091000 2 0011111111 180.00 2009-11-15

Gracias por la ayuda

Respuesta Responder a este mensaje
#2 Samuel SMH
28/01/2010 - 20:15 | Informe spam
Hola Alejandro,, si me olvide de especificar, utilizo SS 2000 pero esta buena
tu practica para el SS2005.
Tendras algo que pueda hacer lo mismo en el SS2000?

Saludos.

"Alejandro Mesa" wrote:

Samuel,

Cual version de SS usas?

En las versiones 2005 / 2008, puedes hacer uso de las funciones de rango y
la clausula OVER.

DECLARE @T TABLE (
semestre int,
cuota int,
recibo varchar(15),
monto money,
fecha datetime
);

INSERT INTO @T VALUES(20092596, 1, '20030750033', 348.50, '2009-08-31');
INSERT INTO @T VALUES(20092596, 1, '0720248949', 229.50, '2009-08-31');
INSERT INTO @T VALUES(20091000, 2, '0011111111', 100.00, '2009-11-15');
INSERT INTO @T VALUES(20091000, 2, '0022222222', 80.00, '2009-11-10');

;WITH r_set AS (
SELECT
semestre,
cuota,
recibo,
monto,
fecha,
ROW_NUMBER() OVER(PARTITION BY semestre, cuota ORDER BY fecha) AS rn,
SUM(monto) OVER(PARTITION BY semestre, cuota) AS sum_monto
FROM
@T
)
SELECT
semestre,
cuota,
recibo,
sum_monto,
fecha
FROM
r_set
WHERE
rn = 1;
GO


AMB




"Samuel SMH" wrote:

> Hola foro:
> tengo lo siguiente
> semestre cuota recibo monto fecha
> 20092596 1 20030750033 348.50 2009-08-31
> 20092596 1 0720248949 229.50 2009-08-31
> 20091000 2 0011111111 100.00 2009-11-15
> 20091000 2 0022222222 80.00 2009-11-10
>
> deseo obtener el primer registro de cada cuota sumando Monto;
> y conservar todas las columnas;
> Asi:
> semestre cuota recibo monto fecha
> 20092596 1 20030750033 578.00 2009-08-31
> 20091000 2 0011111111 180.00 2009-11-15
>
> Gracias por la ayuda
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
28/01/2010 - 21:33 | Informe spam
Samuel,

Aca tienes una posible solucion para SS 2000. No esperes que el desempanio
sea bueno, pues como ves estoy usando un query correlacionado para calcular
la columna [rn], y otro query para la suma agrupada por (semestre, cuota).

DECLARE @T TABLE (
semestre int,
cuota int,
recibo varchar(15),
monto money,
fecha datetime
);

INSERT INTO @T VALUES(20092596, 1, '20030750033', 348.50, '2009-08-31');
INSERT INTO @T VALUES(20092596, 1, '0720248949', 229.50, '2009-08-31');
INSERT INTO @T VALUES(20091000, 2, '0011111111', 100.00, '2009-11-15');
INSERT INTO @T VALUES(20091000, 2, '0022222222', 80.00, '2009-11-10');

SELECT
T1.semestre,
T1.cuota,
T1.recibo,
T2.sum_monto,
T1.fecha
FROM
(
SELECT
A.semestre,
A.cuota,
A.recibo,
A.monto,
A.fecha,
(
SELECT
COUNT(*)
FROM
@T AS B
WHERE
B.semestre = A.semestre
AND B.cuota = A.cuota
AND (
B.fecha < A.fecha
OR (B.fecha = A.fecha AND B.recibo <= A.recibo)
)
) AS rn
FROM
@T AS A
) AS T1
INNER JOIN
(
SELECT C.semestre, C.cuota, SUM(C.monto) AS sum_monto
FROM @T AS C
GROUP BY C.semestre, C.cuota
) AS T2
ON T2.semestre = T1.semestre
AND T2.cuota = T1.cuota
AND T1.rn = 1;
GO


AMB



"Samuel SMH" wrote:

Hola Alejandro,, si me olvide de especificar, utilizo SS 2000 pero esta buena
tu practica para el SS2005.
Tendras algo que pueda hacer lo mismo en el SS2000?

Saludos.

"Alejandro Mesa" wrote:

> Samuel,
>
> Cual version de SS usas?
>
> En las versiones 2005 / 2008, puedes hacer uso de las funciones de rango y
> la clausula OVER.
>
> DECLARE @T TABLE (
> semestre int,
> cuota int,
> recibo varchar(15),
> monto money,
> fecha datetime
> );
>
> INSERT INTO @T VALUES(20092596, 1, '20030750033', 348.50, '2009-08-31');
> INSERT INTO @T VALUES(20092596, 1, '0720248949', 229.50, '2009-08-31');
> INSERT INTO @T VALUES(20091000, 2, '0011111111', 100.00, '2009-11-15');
> INSERT INTO @T VALUES(20091000, 2, '0022222222', 80.00, '2009-11-10');
>
> ;WITH r_set AS (
> SELECT
> semestre,
> cuota,
> recibo,
> monto,
> fecha,
> ROW_NUMBER() OVER(PARTITION BY semestre, cuota ORDER BY fecha) AS rn,
> SUM(monto) OVER(PARTITION BY semestre, cuota) AS sum_monto
> FROM
> @T
> )
> SELECT
> semestre,
> cuota,
> recibo,
> sum_monto,
> fecha
> FROM
> r_set
> WHERE
> rn = 1;
> GO
>
>
> AMB
>
>
>
>
> "Samuel SMH" wrote:
>
> > Hola foro:
> > tengo lo siguiente
> > semestre cuota recibo monto fecha
> > 20092596 1 20030750033 348.50 2009-08-31
> > 20092596 1 0720248949 229.50 2009-08-31
> > 20091000 2 0011111111 100.00 2009-11-15
> > 20091000 2 0022222222 80.00 2009-11-10
> >
> > deseo obtener el primer registro de cada cuota sumando Monto;
> > y conservar todas las columnas;
> > Asi:
> > semestre cuota recibo monto fecha
> > 20092596 1 20030750033 578.00 2009-08-31
> > 20091000 2 0011111111 180.00 2009-11-15
> >
> > Gracias por la ayuda
> >
Respuesta Responder a este mensaje
#4 Juan Carlos Leguizamon
29/01/2010 - 16:30 | Informe spam
Alejandro: Gracias por el dato de la clausula OVER, la verdad lo desconocia
:(

Samuel: También la consulta podría ser (basado en los mismos datos de
Alejandro):

SELECT
t1.semestre,
t1.cuota,
(SELECT MIN(recibo) FROM @T t2
WHERE t1.semestre = t2.semestre AND t1.cuota = t2.cuota
AND t2.fecha = (SELECT MIN(fecha) FROM @T t3 WHERE t3.semestre =
t1.semestre AND t3.cuota = t1.cuota )),
SUM(monto)
FROM @T AS t1
GROUP BY t1.semestre, t1.cuota


"Alejandro Mesa" escribió en el
mensaje news:
Samuel,

Aca tienes una posible solucion para SS 2000. No esperes que el desempanio
sea bueno, pues como ves estoy usando un query correlacionado para
calcular
la columna [rn], y otro query para la suma agrupada por (semestre, cuota).

DECLARE @T TABLE (
semestre int,
cuota int,
recibo varchar(15),
monto money,
fecha datetime
);

INSERT INTO @T VALUES(20092596, 1, '20030750033', 348.50, '2009-08-31');
INSERT INTO @T VALUES(20092596, 1, '0720248949', 229.50, '2009-08-31');
INSERT INTO @T VALUES(20091000, 2, '0011111111', 100.00, '2009-11-15');
INSERT INTO @T VALUES(20091000, 2, '0022222222', 80.00, '2009-11-10');

SELECT
T1.semestre,
T1.cuota,
T1.recibo,
T2.sum_monto,
T1.fecha
FROM
(
SELECT
A.semestre,
A.cuota,
A.recibo,
A.monto,
A.fecha,
(
SELECT
COUNT(*)
FROM
@T AS B
WHERE
B.semestre = A.semestre
AND B.cuota = A.cuota
AND (
B.fecha < A.fecha
OR (B.fecha = A.fecha AND B.recibo <= A.recibo)
)
) AS rn
FROM
@T AS A
) AS T1
INNER JOIN
(
SELECT C.semestre, C.cuota, SUM(C.monto) AS sum_monto
FROM @T AS C
GROUP BY C.semestre, C.cuota
) AS T2
ON T2.semestre = T1.semestre
AND T2.cuota = T1.cuota
AND T1.rn = 1;
GO


AMB



"Samuel SMH" wrote:

Hola Alejandro,, si me olvide de especificar, utilizo SS 2000 pero esta
buena
tu practica para el SS2005.
Tendras algo que pueda hacer lo mismo en el SS2000?

Saludos.

"Alejandro Mesa" wrote:

> Samuel,
>
> Cual version de SS usas?
>
> En las versiones 2005 / 2008, puedes hacer uso de las funciones de
> rango y
> la clausula OVER.
>
> DECLARE @T TABLE (
> semestre int,
> cuota int,
> recibo varchar(15),
> monto money,
> fecha datetime
> );
>
> INSERT INTO @T VALUES(20092596, 1, '20030750033', 348.50,
> '2009-08-31');
> INSERT INTO @T VALUES(20092596, 1, '0720248949', 229.50, '2009-08-31');
> INSERT INTO @T VALUES(20091000, 2, '0011111111', 100.00, '2009-11-15');
> INSERT INTO @T VALUES(20091000, 2, '0022222222', 80.00, '2009-11-10');
>
> ;WITH r_set AS (
> SELECT
> semestre,
> cuota,
> recibo,
> monto,
> fecha,
> ROW_NUMBER() OVER(PARTITION BY semestre, cuota ORDER BY fecha) AS rn,
> SUM(monto) OVER(PARTITION BY semestre, cuota) AS sum_monto
> FROM
> @T
> )
> SELECT
> semestre,
> cuota,
> recibo,
> sum_monto,
> fecha
> FROM
> r_set
> WHERE
> rn = 1;
> GO
>
>
> AMB
>
>
>
>
> "Samuel SMH" wrote:
>
> > Hola foro:
> > tengo lo siguiente
> > semestre cuota recibo monto fecha
> > 20092596 1 20030750033 348.50 2009-08-31
> > 20092596 1 0720248949 229.50 2009-08-31
> > 20091000 2 0011111111 100.00 2009-11-15
> > 20091000 2 0022222222 80.00 2009-11-10
> >
> > deseo obtener el primer registro de cada cuota sumando Monto;
> > y conservar todas las columnas;
> > Asi:
> > semestre cuota recibo monto fecha
> > 20092596 1 20030750033 578.00 2009-08-31
> > 20091000 2 0011111111 180.00 2009-11-15
> >
> > Gracias por la ayuda
> >
Respuesta Responder a este mensaje
#5 Samuel SMH
29/01/2010 - 23:13 | Informe spam
Gracias Alejandro me sirvio para replantear el tema, si efectivamente se hara
muy pesado al consultar, pero creando tablas temporales y luego haciendo
cruces puedo lograrlo tambien...
Intentaré, gracias.

"Alejandro Mesa" wrote:

Samuel,

Aca tienes una posible solucion para SS 2000. No esperes que el desempanio
sea bueno, pues como ves estoy usando un query correlacionado para calcular
la columna [rn], y otro query para la suma agrupada por (semestre, cuota).

DECLARE @T TABLE (
semestre int,
cuota int,
recibo varchar(15),
monto money,
fecha datetime
);

INSERT INTO @T VALUES(20092596, 1, '20030750033', 348.50, '2009-08-31');
INSERT INTO @T VALUES(20092596, 1, '0720248949', 229.50, '2009-08-31');
INSERT INTO @T VALUES(20091000, 2, '0011111111', 100.00, '2009-11-15');
INSERT INTO @T VALUES(20091000, 2, '0022222222', 80.00, '2009-11-10');

SELECT
T1.semestre,
T1.cuota,
T1.recibo,
T2.sum_monto,
T1.fecha
FROM
(
SELECT
A.semestre,
A.cuota,
A.recibo,
A.monto,
A.fecha,
(
SELECT
COUNT(*)
FROM
@T AS B
WHERE
B.semestre = A.semestre
AND B.cuota = A.cuota
AND (
B.fecha < A.fecha
OR (B.fecha = A.fecha AND B.recibo <= A.recibo)
)
) AS rn
FROM
@T AS A
) AS T1
INNER JOIN
(
SELECT C.semestre, C.cuota, SUM(C.monto) AS sum_monto
FROM @T AS C
GROUP BY C.semestre, C.cuota
) AS T2
ON T2.semestre = T1.semestre
AND T2.cuota = T1.cuota
AND T1.rn = 1;
GO


AMB



"Samuel SMH" wrote:

> Hola Alejandro,, si me olvide de especificar, utilizo SS 2000 pero esta buena
> tu practica para el SS2005.
> Tendras algo que pueda hacer lo mismo en el SS2000?
>
> Saludos.
>
> "Alejandro Mesa" wrote:
>
> > Samuel,
> >
> > Cual version de SS usas?
> >
> > En las versiones 2005 / 2008, puedes hacer uso de las funciones de rango y
> > la clausula OVER.
> >
> > DECLARE @T TABLE (
> > semestre int,
> > cuota int,
> > recibo varchar(15),
> > monto money,
> > fecha datetime
> > );
> >
> > INSERT INTO @T VALUES(20092596, 1, '20030750033', 348.50, '2009-08-31');
> > INSERT INTO @T VALUES(20092596, 1, '0720248949', 229.50, '2009-08-31');
> > INSERT INTO @T VALUES(20091000, 2, '0011111111', 100.00, '2009-11-15');
> > INSERT INTO @T VALUES(20091000, 2, '0022222222', 80.00, '2009-11-10');
> >
> > ;WITH r_set AS (
> > SELECT
> > semestre,
> > cuota,
> > recibo,
> > monto,
> > fecha,
> > ROW_NUMBER() OVER(PARTITION BY semestre, cuota ORDER BY fecha) AS rn,
> > SUM(monto) OVER(PARTITION BY semestre, cuota) AS sum_monto
> > FROM
> > @T
> > )
> > SELECT
> > semestre,
> > cuota,
> > recibo,
> > sum_monto,
> > fecha
> > FROM
> > r_set
> > WHERE
> > rn = 1;
> > GO
> >
> >
> > AMB
> >
> >
> >
> >
> > "Samuel SMH" wrote:
> >
> > > Hola foro:
> > > tengo lo siguiente
> > > semestre cuota recibo monto fecha
> > > 20092596 1 20030750033 348.50 2009-08-31
> > > 20092596 1 0720248949 229.50 2009-08-31
> > > 20091000 2 0011111111 100.00 2009-11-15
> > > 20091000 2 0022222222 80.00 2009-11-10
> > >
> > > deseo obtener el primer registro de cada cuota sumando Monto;
> > > y conservar todas las columnas;
> > > Asi:
> > > semestre cuota recibo monto fecha
> > > 20092596 1 20030750033 578.00 2009-08-31
> > > 20091000 2 0011111111 180.00 2009-11-15
> > >
> > > Gracias por la ayuda
> > >
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida