Cantidad de registros devueltos en una variable por una consulta con group by

25/05/2007 - 17:50 por ghazarian.martin | Informe spam
Hola,
El tema es el siguiente, supongamos que tengo una tabla Ventas, la
cual tiene los siguientes campos:
IdVta, MontoVta,FechaVta,CliVta,StatusVta,

StatusVta puede ser ='VENTA' o 'No Venta'


Yo quiero lo siguiente, con un stored procedured,

Contar la cantidad de ventas que hay!, pero ojo!!.> CliVta es una
referencia lógica a una tabla de clientes, es decir por cada cliente
puede existir varios registros en la tabla venta, A MI ME INTERESA EL
ÚLTIMO REGISTRO INGRESADO, el cual lo controlo por FechaVta
->
select clivta, max(fechavta)
from ventas
group by (clivta)

esto me devuelve por cada cliente la última "venta/no venta" se le
podría agregar en having que sea venta, etc,

quiero saber si existe una manera de contar las ventas por cada
cliente, pero la venta se toma si el último registro por cliente tiene
status = 'VENTA' (por eso no sirve contar la cantidad de veces que
aparezca status=venta, ya que puede ingresarse un registro NO VENTA al
cliente más reciente), espero haberme explicado

No quiero hacer cosas de cursores, etc,
Probé con todo count select, select count, etc,etc, pero no pude, en
internet no encontré absolutamente nada...pero no hay problema que no
tenga solución ¿no?

Gracias como siempre,
Martín

Preguntas similare

Leer las respuestas

#1 Jesús López
25/05/2007 - 19:05 | Informe spam
¿Podrías poner un ejemplo de datos de la tabla Ventas y el resultado de la
consulta que quieres obtener?

Es que tengo mis dudas sobre lo que necesitas hacer.


Saludos:


Jesús López
www.solidq.com



"" escribió en el
mensaje news:
Hola,
El tema es el siguiente, supongamos que tengo una tabla Ventas, la
cual tiene los siguientes campos:
IdVta, MontoVta,FechaVta,CliVta,StatusVta,

StatusVta puede ser ='VENTA' o 'No Venta'


Yo quiero lo siguiente, con un stored procedured,

Contar la cantidad de ventas que hay!, pero ojo!!.> CliVta es una
referencia lógica a una tabla de clientes, es decir por cada cliente
puede existir varios registros en la tabla venta, A MI ME INTERESA EL
ÚLTIMO REGISTRO INGRESADO, el cual lo controlo por FechaVta
->
select clivta, max(fechavta)
from ventas
group by (clivta)

esto me devuelve por cada cliente la última "venta/no venta" se le
podría agregar en having que sea venta, etc,

quiero saber si existe una manera de contar las ventas por cada
cliente, pero la venta se toma si el último registro por cliente tiene
status = 'VENTA' (por eso no sirve contar la cantidad de veces que
aparezca status=venta, ya que puede ingresarse un registro NO VENTA al
cliente más reciente), espero haberme explicado

No quiero hacer cosas de cursores, etc,
Probé con todo count select, select count, etc,etc, pero no pude, en
internet no encontré absolutamente nada...pero no hay problema que no
tenga solución ¿no?

Gracias como siempre,
Martín
Respuesta Responder a este mensaje
#2 Alejandro Mesa
25/05/2007 - 20:00 | Informe spam
,

Cual version de SQL Server estas usando?

;with cte
as
(
select
*, row_number() over(partition by CliVta order by FechaVta DESC) as rn
from
dbo.ventas
where
status = 'VENTA'
)
select
*
from
cte
where
rn = 1
go

Sera de ayuda tener un indice por (CliVta, FechaVta DESC).


AMB



AMB

"" wrote:

Hola,
El tema es el siguiente, supongamos que tengo una tabla Ventas, la
cual tiene los siguientes campos:
IdVta, MontoVta,FechaVta,CliVta,StatusVta,

StatusVta puede ser ='VENTA' o 'No Venta'


Yo quiero lo siguiente, con un stored procedured,

Contar la cantidad de ventas que hay!, pero ojo!!.> CliVta es una
referencia lógica a una tabla de clientes, es decir por cada cliente
puede existir varios registros en la tabla venta, A MI ME INTERESA EL
ÚLTIMO REGISTRO INGRESADO, el cual lo controlo por FechaVta
->
select clivta, max(fechavta)
from ventas
group by (clivta)

esto me devuelve por cada cliente la última "venta/no venta" se le
podría agregar en having que sea venta, etc,

quiero saber si existe una manera de contar las ventas por cada
cliente, pero la venta se toma si el último registro por cliente tiene
status = 'VENTA' (por eso no sirve contar la cantidad de veces que
aparezca status=venta, ya que puede ingresarse un registro NO VENTA al
cliente más reciente), espero haberme explicado

No quiero hacer cosas de cursores, etc,
Probé con todo count select, select count, etc,etc, pero no pude, en
internet no encontré absolutamente nada...pero no hay problema que no
tenga solución ¿no?

Gracias como siempre,
Martín


Respuesta Responder a este mensaje
#3 ghazarian.martin
26/05/2007 - 06:32 | Informe spam
la versión es SQL SERVER 2000, respecto al ejemplo sería así:
la tabla ventas tiene 4 campos:
1-CodigoVta
2-FechaVta
3-MontoVta
4-EstadoVta
5-ClienteVta

entonces para los datos:

CodigoVta FechaVta
MontoVta EstadoVta ClienteVta

1 10/10/2000
1.000 VENTA 1
2 12/10/2004
25000 VENTA 1
3 14/05/2005
3000 NO VENTA 1
4 05/06/2004
200 VENTA 2
5 06/06/2007
5000 VENTA 2

Yo quiero un Stored Procedure, que me devuelva la cantidad de VENTAS,
para saberlas, por cada cliente me tengo que fijar el último
registro(es decir hacer un group by con el cliente y los demás datos,
con MAX(FechaVta),
en el ejemplo consideraria 2 registros, 1 por cada cliente (siempre
será así), y el que tiene la fecha más reciente, es decir el de
codigoVta = 3 para el clientevta=1, y el codigovta=5 para el
clientevta = 2,

entonces en ambos me fijo si EstadoVta es igual a VENTA, si es VENTA
sumo 1 sino no, de esta manera devolver todas las ventas realizadas,
considerandolas repito, como la última info ingresada por cliente,


sería como hacer un count de un select con un group by, supongo,
porque se hacer el :
"select cliente, max(fecha)
from ventas
group by cliente"

esto devuelve los clientes con su última factura, pero como contar el
número de registros de VENTAS????????

Gracias,
Martín
Respuesta Responder a este mensaje
#4 Jesús López
26/05/2007 - 10:52 | Informe spam
Lo siento pero para mi sigue sin quedar claro qué estas contando, entre
otras cosas al final no has dicho cual es el resultado de la consulta, en el
emplo ¿Qué número tiene que devolver?

Parece claro que las ventas con CodigoVta = 1, 2, 3 no cuentan porque el
último (CodigoVta=3) tiene EstadoVta = 'NO VENTA'.

Pero ahora, para ClienteVta = 2. ¿Qué cuento? ¿Todos los registros, sólo los
registros que tengan EstadoVta='VENTA' o cuento 1 como un ClienteVta?
Si son todos los registros la sentencia sería:


SELECT SUM(NumVentas) AS TotalVentas
FROM (
SELECT COUNT(*) AS NumVentas, ClienteVta
FROM Ventas V1
GROUP BY ClienteVta
HAVING (SELECT TOP 1 EstadoVta
FROM Ventas V2
WHERE V2.ClienteVta = V1.ClienteVta
ORDER BY FechaVta DESC, CodigoVta DESC) = 'VENTA'
) AS V

Que devuelve 2.

Lo que yo enunciaría como "Contar el total de registros de venta para
aquellos ClientesVta cuyo último registro de venta tenga un estado de venta
= 'VENTA' "


-
Si son sólo los que tengan EstadoVta='VENTA' sería:

SELECT SUM(NumVentas) AS TotalVentas
FROM (
SELECT COUNT(*) AS NumVentas, ClienteVta
FROM Ventas V1
WHERE V1.EstadoVta = 'VENTA'
GROUP BY ClienteVta
HAVING (SELECT TOP 1 EstadoVta
FROM Ventas V2
WHERE V2.ClienteVta = V1.ClienteVta
ORDER BY FechaVta DESC, CodigoVta DESC) = 'VENTA'
) AS V

Lo que yo enunciaría como "Contar el total de registros de venta con estado
de venta = 'VENTA' para aquellos ClientesVta cuyo último registro de venta
tenga un estado de venta = 'VENTA'

Que devuelve 2 también porque no hay ningún registro de ClienteVta=2 que
tenga EstadoVta='NO VENTA'

-

Si es 1 como un ClienteVta. Es decir, que lo que quisieras contar fuera el
número de ClientesVta cuyo último EstadoVta sea 'VENTA'. Si es eso lo que
quieres esta sería la sentencia:

SELECT COUNT(*)
FROM (
SELECT ClienteVta
FROM Ventas V1
GROUP BY ClienteVta
HAVING (SELECT TOP 1 EstadoVta
FROM Ventas V2
WHERE V2.ClienteVta = V1.ClienteVta
ORDER BY FechaVta DESC, CodigoVta DESC) = 'VENTA'
) AS V

Que devuelve 1 porque sólo hay un ClienteVta cuyo último EstadoVta = 'VENTA'

-

Así que tú dirás. No se me ocurren más cosas que pudieras querer. Pero ya
podías haber sido más riguroso al definir lo que quieres

Saludos:

Jesús López
www.solidq.com





"" escribió en el
mensaje news:
la versión es SQL SERVER 2000, respecto al ejemplo sería así:
la tabla ventas tiene 4 campos:
1-CodigoVta
2-FechaVta
3-MontoVta
4-EstadoVta
5-ClienteVta

entonces para los datos:

CodigoVta FechaVta
MontoVta EstadoVta ClienteVta

1 10/10/2000
1.000 VENTA 1
2 12/10/2004
25000 VENTA 1
3 14/05/2005
3000 NO VENTA 1
4 05/06/2004
200 VENTA 2
5 06/06/2007
5000 VENTA 2

Yo quiero un Stored Procedure, que me devuelva la cantidad de VENTAS,
para saberlas, por cada cliente me tengo que fijar el último
registro(es decir hacer un group by con el cliente y los demás datos,
con MAX(FechaVta),
en el ejemplo consideraria 2 registros, 1 por cada cliente (siempre
será así), y el que tiene la fecha más reciente, es decir el de
codigoVta = 3 para el clientevta=1, y el codigovta=5 para el
clientevta = 2,

entonces en ambos me fijo si EstadoVta es igual a VENTA, si es VENTA
sumo 1 sino no, de esta manera devolver todas las ventas realizadas,
considerandolas repito, como la última info ingresada por cliente,


sería como hacer un count de un select con un group by, supongo,
porque se hacer el :
"select cliente, max(fecha)
from ventas
group by cliente"

esto devuelve los clientes con su última factura, pero como contar el
número de registros de VENTAS????????

Gracias,
Martín
Respuesta Responder a este mensaje
#5 ghazarian.martin
31/05/2007 - 21:53 | Informe spam
quiero que me devuelva la cantidad de ventas, es decir un número
dicho cardinal dependerá de la cantidad de ventas que se hayan
realizado, para ver esto veo en la tabla ventas, la última gestión de
cada cliente, es decir por cada cliente tomo el registro con la fecha
más reciente y veo si es 'VENTA' si es venta sumo sino no...
pero ese número lo quiero en una variable, porque lo estoy usando en
un STORED PROCEDURE

Gracias por las participaciones realizadas, y espero que encontremos
una solución..
Un Abrazo,
Martín
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida