Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Saber las cantidades vendidas de un producto

Estas en el tema de Saber las cantidades vendidas de un producto en el foro de Bases de Datos General en Foros del Web. Buenas amigos busco saber que cantidad de un producto vendi en un determinado lapso de tiempo, les cuento la estructura de las tablas: ventas (maneja ...
  #1 (permalink)  
Antiguo 04/04/2014, 10:52
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Saber las cantidades vendidas de un producto

Buenas amigos busco saber que cantidad de un producto vendi en un determinado lapso de tiempo, les cuento la estructura de las tablas:

ventas (maneja los datos como fecha, tipo de doc, cliente..)
ventas_detalles (maneja que producto has comprado Ejemplo ENSALADA de POLLO, cantidad etc)
productos_compuestos (maneja la info del producto a vender Ejemplo: Ensalada de pollo, departamento, precio)
productos_compuestos_partes (maneja la info de los ingredientes que componen un producto_compuesto Ejemplo: Ensalada de pollo, pollo, lechuga, domo, maiz, y sus cantidades)
productos_terminados (maneja la informacion de los productos que componen un producto_compuesto ejemplo, lechuga es del dpto insumos, permite manejar decimales es de unidad KG)

entonces el query:

Código SQL:
Ver original
  1. SELECT ventas_detalles.producto_nombre FROM ventas INNER JOIN ventas_detalles ON ventas.correlativo=ventas_detalles.correlativo_principal INNER JOIN productos_compuestos ON ventas_detalles.producto_codigo=productos_compuestos.codigo_producto INNER JOIN productos_compuestos_partes ON productos_compuestos.codigo_producto=productos_compuestos_partes.parte_producto_codigo INNER JOIN productos_terminados ON productos_compuestos_partes.parte_producto_codigo=productos_terminados.codigo_producto WHERE (productos_terminados.nombre LIKE '%ADR%') AND (ventas.fecha_emision BETWEEN '2014.03.17' AND '2014.03.24') AND (ventas.temporal = 'F')

y esto me arroja NULL =(

Señale Cantidad y fehca porque lo que busco es Sumar las cantidades de un Aderezo, para ver como se mueve en una semana.

Alguien podria hecharme una mano?
  #2 (permalink)  
Antiguo 04/04/2014, 13:02
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Saber las cantidades vendidas de un producto

un ejemplo de tus datos seria de mas ayuda que solo ver tu query....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 04/04/2014, 13:27
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Saber las cantidades vendidas de un producto

Por principio de cuentas, no creo que la comparación de tus fechas funcione como lo estas haciendo. (a simple vista)
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 04/04/2014, 14:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Saber las cantidades vendidas de un producto

Cita:
Iniciado por JuJoGuAl Ver Mensaje
Buenas amigos busco saber que cantidad de un producto vendi en un determinado lapso de tiempo, les cuento la estructura de las tablas:

(...)

y esto me arroja NULL =(

Señale Cantidad y fehca porque lo que busco es Sumar las cantidades de un Aderezo, para ver como se mueve en una semana.

Alguien podria hecharme una mano?
Por lo pronto, trata de simplificar las cosas, y usar alias. Ayuda a poder leer la query sin tantas complicaciones:

Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto
  7. WHERE
  8.     (PT.nombre LIKE '%ADR%')
  9.     AND (VE.fecha_emision BETWEEN '2014.03.17' AND '2014.03.24')
  10.     AND (VE.temporal = 'F')
Luego, considerando que una query sólo devuelve NULL si no se cumplen todas las condiciones al mismo tiempo, yo te sugeriría que analices los resultaods parte por parte, a ver qué condición no se cumple.
Primero los JOIN:
Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto

Después las ventas:
Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto
  7. WHERE
  8.     (VE.temporal = 'F')

Despues las fechas:
Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto
  7. WHERE
  8.     (VE.fecha_emision BETWEEN '2014.03.17' AND '2014.03.24')
y luego los productos terminados:
Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto
  7. WHERE
  8.     (PT.nombre LIKE '%ADR%') )

Si falla la primera, los JOINs no se cumplen todos.
Si falla la fecha (muy probable), el formato usado no es correcto.
Como sea, hay que depurar una a una.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 04/04/2014, 16:33
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Saber las cantidades vendidas de un producto

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por lo pronto, trata de simplificar las cosas, y usar alias. Ayuda a poder leer la query sin tantas complicaciones:

Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto
  7. WHERE
  8.     (PT.nombre LIKE '%ADR%')
  9.     AND (VE.fecha_emision BETWEEN '2014.03.17' AND '2014.03.24')
  10.     AND (VE.temporal = 'F')
Luego, considerando que una query sólo devuelve NULL si no se cumplen todas las condiciones al mismo tiempo, yo te sugeriría que analices los resultaods parte por parte, a ver qué condición no se cumple.
Primero los JOIN:
Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto

Después las ventas:
Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto
  7. WHERE
  8.     (VE.temporal = 'F')

Despues las fechas:
Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto
  7. WHERE
  8.     (VE.fecha_emision BETWEEN '2014.03.17' AND '2014.03.24')
y luego los productos terminados:
Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto
  7. WHERE
  8.     (PT.nombre LIKE '%ADR%') )

Si falla la primera, los JOINs no se cumplen todos.
Si falla la fecha (muy probable), el formato usado no es correcto.
Como sea, hay que depurar una a una.
Usare tu ejemplo, por la fecha no me preocupo porque es una BD Interbase (Firebird) y pues asi me pide que coloque las fechas para las consultas.. Gracias por la sugerencia la tomare en cuenta.
  #6 (permalink)  
Antiguo 04/04/2014, 16:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Saber las cantidades vendidas de un producto

a ver vienes a un foro de sql server a pedir ayuda para una base en firebird???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 04/04/2014, 17:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Saber las cantidades vendidas de un producto

Cita:
Iniciado por JuJoGuAl Ver Mensaje
Usare tu ejemplo, por la fecha no me preocupo porque es una BD Interbase (Firebird) y pues asi me pide que coloque las fechas para las consultas.. Gracias por la sugerencia la tomare en cuenta.
Como ya te dijeron... ¿Por qué posteaste en el foro de SQL SERVER?
En todo caso, en primer lugar debes postear en el Foro de Bases de Datos General, y en segundo, debes aclarar qué DBMS usas, ya que no todos tienen las mismas sintaxis en algunas cosas, y en especial en el manejo de datos de fechas.

Movido a Bases de Datos General.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 07/04/2014, 07:36
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Saber las cantidades vendidas de un producto

Bueno generalmente cuando busco saber algo sobre BD lo posteo en SQL puesto que la sintaxis no suele ser "tan diferente" entre ellas, pero bueno disculpen mi error...

En cuanto a las condiciiones de los Join, corregi una y la sql esta funcionando aparentemente bien, solo que no me toma fechas del 2014...

algo extraño esta pasando =S
  #9 (permalink)  
Antiguo 07/04/2014, 07:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Saber las cantidades vendidas de un producto

Cita:
Iniciado por JuJoGuAl Ver Mensaje
Bueno generalmente cuando busco saber algo sobre BD lo posteo en SQL puesto que la sintaxis no suele ser "tan diferente" entre ellas, pero bueno disculpen mi error...

En cuanto a las condiciiones de los Join, corregi una y la sql esta funcionando aparentemente bien, solo que no me toma fechas del 2014...

algo extraño esta pasando =S
si pero si por ejempo te digo que uses una funcion row_number no va a ser compatible con firebird....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 07/04/2014, 08:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Saber las cantidades vendidas de un producto

Cita:
Separators in Non-U.S. Dates

Nothing causes more confusion for international users than Firebird's restricting the use of the forward slash character (/) to only the U.S. 'MM/DD/CCYY' format. Although almost all other countries use 'DD/MM/CCYY', Firebird will either record the wrong date or throw an exception with the date literal using the 'DD/MM/CCYY' convention.

For example, the date literal '12/01/2004' will always be stored with meaning "December 1, 2004" and '14/01/2004' will cause an out-of-range exception because there is no month 14.

Note that Firebird does not honor the Windows or Linux date locale format when interpreting date literals. Its interpretation of all-number date formats is decided by the separator character. When dot (.) is used as separator, Firebird interprets it as the non-U.S. notation DD.MM, whereas with any other separator it assumes the U.S. MM/DD notation. Outside the U.S. date locale, your applications should enforce or convert locale-specific DD/MM/CCYY date input to a literal that replaces the forward slash with a period (dot) as the separator. 'DD.MM.CCYY' is valid. Other date literal formats may be substituted.
Código SQL:
Ver original
  1. SELECT VD.producto_nombre
  2. FROM ventas VE
  3.     INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.     INNER JOIN productos_compuestos PC ON VD.producto_codigo = PC.codigo_producto
  5.     INNER JOIN productos_compuestos_partes PCP ON PC.codigo_producto = PCP.parte_producto_codigo
  6.     INNER JOIN productos_terminados PT ON PCP.parte_producto_codigo = PT.codigo_producto
  7. WHERE
  8.     (PT.nombre LIKE '%ADR%')
  9.     AND (VE.fecha_emision BETWEEN '17.03.2014' AND '24.03.2014')
  10.     AND (VE.temporal = 'F')

Cita:
Bueno generalmente cuando busco saber algo sobre BD lo posteo en SQL puesto que la sintaxis no suele ser "tan diferente" entre ellas
Son terriblemente diferentes entre si cuando se trata de fechas, horas y algunas funciones propias de cada DBMS.
NUNCA debes asumir que SQL Server (de Microsoft) es un estándar para BBDD y menos para SQL.
SQL no es SQL Server. Este último es uno de los DBMS que existen, pero no es ni el mejor, ni el más difundido.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 07/04/2014, 09:12
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Saber las cantidades vendidas de un producto

Cita:
Iniciado por Libras Ver Mensaje
si pero si por ejempo te digo que uses una funcion row_number no va a ser compatible con firebird....
En efecto, si alguien me dice que tengo que usar una funcion busco como hacerla en el Firebird, pero entiendo el punto y retiro lo dicho.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Son terriblemente diferentes entre si cuando se trata de fechas, horas y algunas funciones propias de cada DBMS.
NUNCA debes asumir que SQL Server (de Microsoft) es un estándar para BBDD y menos para SQL.
SQL no es SQL Server. Este último es uno de los DBMS que existen, pero no es ni el mejor, ni el más difundido.
Bueno no soy el mas apropiado para hablar de tipos de Base de Datos, se que hay diferencias entre una y la otra pero que tan diferentes son no lo se.

Volviendo al tema Original, he encontrado una tabla llamada VENTAS_DETALLES_PARTES, que maneja los PRODUCTOS TERMINADOS (PT) que se mueven en una Venta (no sabia la existencia de esa Base de datos, puesto que el programa que utilizo para mirarlas no es muy amigable...)

La consulta quedaría:

Código SQL:
Ver original
  1. SELECT VDP.producto_nombre
  2.     FROM ventas VE
  3.         INNER JOIN ventas_detalles VD ON VE.correlativo = VD.correlativo_principal
  4.         INNER JOIN ventas_detalles_partes VDP ON VD.correlativo_principal = VDP.correlativo_principal
  5.     WHERE
  6.         (VE.fecha_emision BETWEEN '2014.03.31' AND '2014.04.06')
  7.         AND (VE.temporal = 'F')

Con eso ya consulto los productos y lo que me tocaria es agregar los condicionales como VDP.producto_nombre like %ADR%...

Gracias Chicos por las clases y no se molesten conmigo
  #12 (permalink)  
Antiguo 07/04/2014, 09:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Saber las cantidades vendidas de un producto

Código SQL:
Ver original
  1. (VE.fecha_emision BETWEEN '2014.03.31' AND '2014.04.06')
Sigo teniendo dudas de que Firebird interprete bien esas fechas así...
¿Seguro que andan?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 07/04/2014, 10:36
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Respuesta: Saber las cantidades vendidas de un producto

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Código SQL:
Ver original
  1. (VE.fecha_emision BETWEEN '2014.03.31' AND '2014.04.06')
Sigo teniendo dudas de que Firebird interprete bien esas fechas así...
¿Seguro que andan?


Si bueno me deja colocar formatos como (dd.mm.aaaa o aaaa.mm.dd) al menos que en la consulta yo le formatee la fecha para moverla de otro modo...
  #14 (permalink)  
Antiguo 07/04/2014, 10:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Saber las cantidades vendidas de un producto

OK. Es bueno saberlo. La documentación sobre Firebird es bastante insuficiente y poco detallada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: producto, query, select, sql-server, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:48.