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:

Mostrar la cita
#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:

Mostrar la cita
#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:

Mostrar la cita
#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:
Mostrar la cita
#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:

Mostrar la cita
Ads by Google
Search Busqueda sugerida