SQL - Mostrar varios campos de una tabla usan group by

 
Vista:

Mostrar varios campos de una tabla usan group by

Publicado por Luis (7 intervenciones) el 01/05/2019 02:12:41
Buenas tengo la siguiente consulta:
select cod_cte, MAX(fecha_compra) as fecha from ventas
where fecha between '20180101' and '20190501' group by cod_cte

Esa consulta me muestra la ultima compra de todos mis clientes que me han comprado desde enero de 2018 hasta la fecha.

Lo que quiero es que aparte del campo código de cliente me muestre mas campos como nombre de cliente, el folio de la compra, la cantidad cobrada.
Trato de hacerlo con la siguiente consulta pero no me funciona pk no me muestra los datos correctos:

select cod_cte, folio, nombre, total, MAX(fecha_compra) as fecha from ventas
where fecha between '20180101' and '20190501' group by cod_cte, folio, nombre, total

Como puedo mostrar mas campos sin que se me destruya la consulta principal, la primer consulta me arroja bien los registros solo quiero mostrar mas campos de cada registro.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Mostrar varios campos de una tabla usan group by

Publicado por Isaias (1921 intervenciones) el 01/05/2019 03:37:08
Primero, las fechas siempre se consultan con >= y <=

Segundo, haga una subselect

Si ya la consulta que nos muestra le da la información que necesita, solo requiere

1
2
3
4
5
6
7
SELECT miscampos_faltantes
FROM sutabla(s)
WHERE EXISTS(
select cod_cte, MAX(fecha_compra) as fecha from ventas vtas
where fecha between '20180101' and '20190501'
and myid = ventas.myid
group by cod_cte)

¿Se comprende?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Mostrar varios campos de una tabla usan group by

Publicado por gilman (103 intervenciones) el 01/05/2019 09:10:58
Dos cosas, la consulta que lanzas, no devuelve la fecha de la última venta, usar >= y <= es lo que hace precisamente la clausula BETWEEN
Una posible solución es:
1
2
3
4
5
SELECT Clientes.*, UltimaVenta.fecha FROM Clientes,
		(select cod_cte, MAX(fecha_compra) as fecha from ventas
		where fecha between '20180101' and '20190501'
		group by cod_cte) UltimaVenta
WHERE Clientes.cod_cte = UltimaVenta.cod_cte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Mostrar varios campos de una tabla usan group by

Publicado por Isaias (1921 intervenciones) el 01/05/2019 16:21:26
Se han hecho comparaciones sobre el uso de BETWEEN y >= <= en campos de tipo fecha y hay una mejor respuesta en tiempos de la segunda, solo es por TIEMPOS DE RESPUESTA y mas, cuando hay una considerable cantidad de registros.

Recordemos que las fechas se almacenan en formato numerico

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mostrar varios campos de una tabla usan group by

Publicado por Luis (7 intervenciones) el 01/05/2019 22:53:05
Disculpen pero no me ha servido ninguna de sus consultas a lo mejor no las entendi.
Lo que necesito es lo siguiente:

Tengo una tabla llamada ventas y al hacer una consulta: select * from ventas
me muestra a siguiente tabla:

folio fecha cod_cte cod_prod cantidad_piezas total_pagar
2450 25/12/2018 0005 CTRIW0 10 500
2451 25/12/2018 0008 HKJHKL 15 800
2452 26/12/2018 0005 GJKJJKM 5 200
2453 26/12/2018 0002 JHGHJJL 2 80
2453 26/12/2018 0008 IYKJNLLJ 8 48
2454 27/12/2018 0005 RTGHBVM 15 900

Lo que quiero es una consulta que me muestre solo los registros de la ultima compra de cada cliente, mostrando todos esos campo folio fecha cod_cte, cod_prod, cantidad_piezas, total_pagar.
Osea un registro por cliente (cod_cte) de su ultima compra.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Mostrar varios campos de una tabla usan group by

Publicado por gilman (103 intervenciones) el 02/05/2019 08:43:12
Prueba:
1
2
3
4
5
6
SELECT Ventas.* FROM Clientes,
	(select cod_cte, MAX(fecha) as fecha from ventas
	where fecha between '20180101' and '20190501'
	group by cod_cte) UltimaVenta
WHERE Clientes.cod_cte = UltimaVenta.cod_cte
	and Clientes.fecha = UltimaVenta.fecha
No se que tal será el rendimiento, así que deberías tener en cuenta lo que comenta Isaias en su último post
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mostrar varios campos de una tabla usan group by

Publicado por Luis (7 intervenciones) el 02/05/2019 10:31:26
gilman, disculpa pero tu consulta es errónea, aparte no quiero involucrar a la tabla de clientes.
Todo lo quiero realizar únicamente en tabla ventas.

La siguiente consulta me arroja bien los registros y solo quiero mostrar los demás campos de la tabla ventas:

select cod_cte, MAX(fecha_compra) as fecha from ventas
where fecha between '01/01/2018' and '01/05/2019' group by cod_cte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Mostrar varios campos de una tabla usan group by

Publicado por gilman (103 intervenciones) el 02/05/2019 15:02:20
Ha sido error mio, sustituye clientes por ventas, hice un corta pega de la anterior y se me olvido corregir eso
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mostrar varios campos de una tabla usan group by

Publicado por Luis (7 intervenciones) el 03/05/2019 06:09:04
Ya lo hice pero de todos modos no me manda bien los registros con esa consulta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Mostrar varios campos de una tabla usan group by

Publicado por gilman (103 intervenciones) el 03/05/2019 09:19:34
¿Que problema tienes con los datos que devuelve la consulta?
1
2
3
4
5
6
SELECT Ventas.* FROM Ventas,
	(select cod_cte, MAX(fecha) as fecha from Ventas
	where fecha between '20180101' and '20190501'
	group by cod_cte) UltimaVenta
WHERE Ventas.cod_cte = UltimaVenta.cod_cte
	and Ventas.fecha = UltimaVenta.fecha
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mostrar varios campos de una tabla usan group by

Publicado por Luis (7 intervenciones) el 03/05/2019 19:01:19
Me aparecen varios registros por cliente y solo quiero que me aparezca uno por cliente (solo la ultima compra).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Mostrar varios campos de una tabla usan group by

Publicado por gilman (103 intervenciones) el 03/05/2019 19:51:01
Me imagino que en esos casos devuelve el mismo cliente varias veces, pero con la misma fecha, eso es porque el cliente hizo varias compras la misma fecha y no es posible decidir cual es la ultima, si tienes un campo id autonumerico podria usarse para distinguirlos, si no te convence, deberias tomar nota de la hora de la venta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mostrar varios campos de una tabla usan group by

Publicado por Luis (7 intervenciones) el 03/05/2019 19:54:42
Ya mire que pasa con esa consulta, esta bien solo que me muestra todos los productos que se compraron y como una misma compra tiene varios productos pues todos tiene la misma fecha y hora.

Quiero hacer un reporte donde solo me muestre la fecha de la ultima compra, codigo cliente, folio que seria de la factura y si se puede el monto total de esa compra (seria la suma de lo cobrado de cada producto) y también el monto total de todas la compras de todo el año 2018 por cliente.

Yo hago todo eso en varias consultas pero me gustaría realizarlo en una sola consulta.

La tabla ventas registra la compra de cada producto, guarda fecha, folio factura, cod_cliente, tipo pago, producto, cantidad piezas, total a pagar por la cantidad de piezas de ese producto.
No tengo permisos de acceso a otras tablas por eso todo lo quiero hacer en esta para hacer reportes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Mostrar varios campos de una tabla usan group by

Publicado por gilman (103 intervenciones) el 03/05/2019 20:29:39
Como me imagino que es tarde para cambiar la BD y tener dos tablas Ve6 y DetallesVenta, cambia Ventas.* por DISTNCT Ventas.cod_cte, Ventas.Fecha, Ventas.folio,... con todos los campos innecesarios
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vega
Val: 187
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Mostrar varios campos de una tabla usan group by

Publicado por Vega (73 intervenciones) el 03/05/2019 09:08:43
Hola Luis,

¿As probado usando la función ROW_number para organizar los datos en una consulta de ventana?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
;WITH DATOS AS (
SELECT folio = 2450 , fecha = '25/12/2018', COD_CTE =  0005 , COD_PROD = 'CTRIW0	' , CANTIDAD_PIEZAS = 10	, TOTAL_PAGAR = 500	UNION
SELECT folio = 2451 , fecha = '25/12/2018', COD_CTE =  0008 , COD_PROD = 'HKJHKL	' , CANTIDAD_PIEZAS = 15	, TOTAL_PAGAR = 800	UNION
SELECT folio = 2452 , fecha = '26/12/2018', COD_CTE =  0005 , COD_PROD = 'GJKJJKM	' , CANTIDAD_PIEZAS = 5		, TOTAL_PAGAR = 200	UNION
SELECT folio = 2453 , fecha = '26/12/2018', COD_CTE =  0002 , COD_PROD = 'JHGHJJL	' , CANTIDAD_PIEZAS = 2		, TOTAL_PAGAR = 80	UNION
SELECT folio = 2453 , fecha = '26/12/2018', COD_CTE =  0008 , COD_PROD = 'IYKJNLLJ ' , CANTIDAD_PIEZAS = 8		, TOTAL_PAGAR = 48	UNION
SELECT folio = 2454 , fecha = '27/12/2018', COD_CTE =  0005 , COD_PROD = 'RTGHBVM	' , CANTIDAD_PIEZAS = 15	, TOTAL_PAGAR = 900
)
SELECT * FROM (
	SELECT	Folio
	,		Fecha
	,		COD_CTE
	,		COD_PROD
	,		CANTIDAD_PIEZAS
	,		TOTAL_PAGAR
	,		ORDENDEPEDIDOS = ROW_NUMBER() OVER (PARTITION BY COD_CTE ORDER BY FECHA DESC)
	FROM	DATOS
) solución
WHERE ORDENDEPEDIDOS  =1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar