Consulta SQL Agrupada

21/05/2009 - 00:57 por Mario V. | Informe spam
Saludos amigos!

A ver si alguien me da una mano con esta consulta:
Tengo una tabla con 3 campos:

TARJETA (VARCHAR(20))
STATUS (VARCHAR(20))
FECHA_ENT (DATETIME)

Necesito hacer una consulta que me arroje el registro mas reciente con
respecto al campo fecha
por cada tarjeta que encuentre en un rango de fechas

si hago esto:

SELECT distinct tarjeta, fecha_ent, status
FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT <=
'2009-05-20'
GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

despliega:

tarjeta fecha_ent status
-
36021801234567 2009-05-19 ACTIVACIONES
36021801234567 2009-05-15 ARRIBO
36021801234567 2009-05-15 ENVIO

pero lo que quiero es que solo salga el primer registro

si cambio el GROUP BY por: GROUP BY tarjeta
sale mensaje de error:

Mens. 8120, Nivel 16, Estado 1, Línea 2
Column 'MOVIMIENTOS.FECHA_ENT' is invalid in the select list because it is
not contained in either an aggregate function or the GROUP BY clause.

me pide que agregue al GROUP BY todos los campos que selecciono.

Agradezco su ayuda

Salu2
Mario

Preguntas similare

Leer las respuestas

#1 Mauro Jesús
21/05/2009 - 01:03 | Informe spam
y si ocupas la clausula TOP ?

SELECT TOP 1 distinct tarjeta, fecha_ent, status
FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT <'2009-05-20'
GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

Saludos!
Mauro Jesús


"Mario V." escribió en el mensaje
news:
Saludos amigos!

A ver si alguien me da una mano con esta consulta:
Tengo una tabla con 3 campos:

TARJETA (VARCHAR(20))
STATUS (VARCHAR(20))
FECHA_ENT (DATETIME)

Necesito hacer una consulta que me arroje el registro mas reciente con
respecto al campo fecha
por cada tarjeta que encuentre en un rango de fechas

si hago esto:

SELECT distinct tarjeta, fecha_ent, status
FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT <=
'2009-05-20'
GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

despliega:

tarjeta fecha_ent status
-
36021801234567 2009-05-19 ACTIVACIONES
36021801234567 2009-05-15 ARRIBO
36021801234567 2009-05-15 ENVIO

pero lo que quiero es que solo salga el primer registro

si cambio el GROUP BY por: GROUP BY tarjeta
sale mensaje de error:

Mens. 8120, Nivel 16, Estado 1, Línea 2
Column 'MOVIMIENTOS.FECHA_ENT' is invalid in the select list because it is
not contained in either an aggregate function or the GROUP BY clause.

me pide que agregue al GROUP BY todos los campos que selecciono.

Agradezco su ayuda

Salu2
Mario

Respuesta Responder a este mensaje
#2 Mario V.
21/05/2009 - 02:27 | Informe spam
Gracias por Responder Mauro,

cambie la sentencia por esta: (sin DISTINCT porque sale error)

SELECT TOP 1 fecha_ent, tarjeta, status

FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT
<='2009-05-20'

GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

pero me devuelve el registro con fecha 2009-05-15 no el de fecha 2009-05-19



Salu2

Mario





"Mauro Jesús" escribió en el
mensaje news:O$Kel%
y si ocupas la clausula TOP ?

SELECT TOP 1 distinct tarjeta, fecha_ent, status
FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT <> '2009-05-20'
GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

Saludos!
Mauro Jesús


"Mario V." escribió en el mensaje
news:
Saludos amigos!

A ver si alguien me da una mano con esta consulta:
Tengo una tabla con 3 campos:

TARJETA (VARCHAR(20))
STATUS (VARCHAR(20))
FECHA_ENT (DATETIME)

Necesito hacer una consulta que me arroje el registro mas reciente con
respecto al campo fecha
por cada tarjeta que encuentre en un rango de fechas

si hago esto:

SELECT distinct tarjeta, fecha_ent, status
FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT <=
'2009-05-20'
GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

despliega:

tarjeta fecha_ent status
-
36021801234567 2009-05-19 ACTIVACIONES
36021801234567 2009-05-15 ARRIBO
36021801234567 2009-05-15 ENVIO

pero lo que quiero es que solo salga el primer registro

si cambio el GROUP BY por: GROUP BY tarjeta
sale mensaje de error:

Mens. 8120, Nivel 16, Estado 1, Línea 2
Column 'MOVIMIENTOS.FECHA_ENT' is invalid in the select list because it
is not contained in either an aggregate function or the GROUP BY clause.

me pide que agregue al GROUP BY todos los campos que selecciono.

Agradezco su ayuda

Salu2
Mario






Respuesta Responder a este mensaje
#3 Alejandro Mesa
21/05/2009 - 03:16 | Informe spam
Mario V.,

Cual es la version de SQL Server que usas?

Si tienes 2005 / 2008, entonces puedes usar una funcion de rango (ranking
function).

with r_set
as
(
select
tarjeta, status, fecha_ent,
row_number() over(partition by tarjeta order by fecha_ent DESC, status)
as rn
from
tu_tabla
where
fecha_ent between '20090513' AND '20090520'
)
select tarjeta, status, fecha_ent
from r_set
where rn = 1;
GO


Si tienes una version previa a 2005, entonces seria algo asi como:

select
tarjeta, status, fecha_ent
from
tu_tabla as a
where not exists (
select
*
from
tu_tabla as b
where
b.tarjeta = a.tarjeta
and
(
b.fecha_ent > a.fecha_ent
or
(b.fecha_ent = a.fecha_ent and b.status > a.status)
)
)


AMB


"Mario V." wrote:

Saludos amigos!

A ver si alguien me da una mano con esta consulta:
Tengo una tabla con 3 campos:

TARJETA (VARCHAR(20))
STATUS (VARCHAR(20))
FECHA_ENT (DATETIME)

Necesito hacer una consulta que me arroje el registro mas reciente con
respecto al campo fecha
por cada tarjeta que encuentre en un rango de fechas

si hago esto:

SELECT distinct tarjeta, fecha_ent, status
FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT <=
'2009-05-20'
GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

despliega:

tarjeta fecha_ent status
-
36021801234567 2009-05-19 ACTIVACIONES
36021801234567 2009-05-15 ARRIBO
36021801234567 2009-05-15 ENVIO

pero lo que quiero es que solo salga el primer registro

si cambio el GROUP BY por: GROUP BY tarjeta
sale mensaje de error:

Mens. 8120, Nivel 16, Estado 1, Línea 2
Column 'MOVIMIENTOS.FECHA_ENT' is invalid in the select list because it is
not contained in either an aggregate function or the GROUP BY clause.

me pide que agregue al GROUP BY todos los campos que selecciono.

Agradezco su ayuda

Salu2
Mario



Respuesta Responder a este mensaje
#4 Mauro Jesús
21/05/2009 - 14:59 | Informe spam
si TOP no funciona correctamente, prueba con la instruccion MAX

Saludos!
Mauro Jesús


"Mario V." escribió en el mensaje
news:
Gracias por Responder Mauro,

cambie la sentencia por esta: (sin DISTINCT porque sale error)

SELECT TOP 1 fecha_ent, tarjeta, status

FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT
<='2009-05-20'

GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

pero me devuelve el registro con fecha 2009-05-15 no el de fecha
2009-05-19



Salu2

Mario





"Mauro Jesús" escribió en el
mensaje news:O$Kel%
y si ocupas la clausula TOP ?

SELECT TOP 1 distinct tarjeta, fecha_ent, status
FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT <>> '2009-05-20'
GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

Saludos!
Mauro Jesús


"Mario V." escribió en el mensaje
news:
Saludos amigos!

A ver si alguien me da una mano con esta consulta:
Tengo una tabla con 3 campos:

TARJETA (VARCHAR(20))
STATUS (VARCHAR(20))
FECHA_ENT (DATETIME)

Necesito hacer una consulta que me arroje el registro mas reciente con
respecto al campo fecha
por cada tarjeta que encuentre en un rango de fechas

si hago esto:

SELECT distinct tarjeta, fecha_ent, status
FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT <=
'2009-05-20'
GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

despliega:

tarjeta fecha_ent status
-
36021801234567 2009-05-19 ACTIVACIONES
36021801234567 2009-05-15 ARRIBO
36021801234567 2009-05-15 ENVIO

pero lo que quiero es que solo salga el primer registro

si cambio el GROUP BY por: GROUP BY tarjeta
sale mensaje de error:

Mens. 8120, Nivel 16, Estado 1, Línea 2
Column 'MOVIMIENTOS.FECHA_ENT' is invalid in the select list because it
is not contained in either an aggregate function or the GROUP BY clause.

me pide que agregue al GROUP BY todos los campos que selecciono.

Agradezco su ayuda

Salu2
Mario










Respuesta Responder a este mensaje
#5 Mario V.
22/05/2009 - 00:41 | Informe spam
Gracias por tu respuesta Alejandro

Uso SQLServer 2005, aplique tu ejemplo y funciona perfecto!

Mil gracias nuevamente

Salu2
Mario



"Alejandro Mesa" escribió en el
mensaje news:
Mario V.,

Cual es la version de SQL Server que usas?

Si tienes 2005 / 2008, entonces puedes usar una funcion de rango (ranking
function).

with r_set
as
(
select
tarjeta, status, fecha_ent,
row_number() over(partition by tarjeta order by fecha_ent DESC, status)
as rn
from
tu_tabla
where
fecha_ent between '20090513' AND '20090520'
)
select tarjeta, status, fecha_ent
from r_set
where rn = 1;
GO


Si tienes una version previa a 2005, entonces seria algo asi como:

select
tarjeta, status, fecha_ent
from
tu_tabla as a
where not exists (
select
*
from
tu_tabla as b
where
b.tarjeta = a.tarjeta
and
(
b.fecha_ent > a.fecha_ent
or
(b.fecha_ent = a.fecha_ent and b.status > a.status)
)
)


AMB


"Mario V." wrote:

Saludos amigos!

A ver si alguien me da una mano con esta consulta:
Tengo una tabla con 3 campos:

TARJETA (VARCHAR(20))
STATUS (VARCHAR(20))
FECHA_ENT (DATETIME)

Necesito hacer una consulta que me arroje el registro mas reciente con
respecto al campo fecha
por cada tarjeta que encuentre en un rango de fechas

si hago esto:

SELECT distinct tarjeta, fecha_ent, status
FROM MOVIMIENTOS WHERE FECHA_ENT >= '2009-05-13' AND FECHA_ENT <>> '2009-05-20'
GROUP BY tarjeta,fecha_ent,status ORDER BY tarjeta,fecha_ent

despliega:

tarjeta fecha_ent status
-
36021801234567 2009-05-19 ACTIVACIONES
36021801234567 2009-05-15 ARRIBO
36021801234567 2009-05-15 ENVIO

pero lo que quiero es que solo salga el primer registro

si cambio el GROUP BY por: GROUP BY tarjeta
sale mensaje de error:

Mens. 8120, Nivel 16, Estado 1, Línea 2
Column 'MOVIMIENTOS.FECHA_ENT' is invalid in the select list because it
is
not contained in either an aggregate function or the GROUP BY clause.

me pide que agregue al GROUP BY todos los campos que selecciono.

Agradezco su ayuda

Salu2
Mario



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida