Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-09-2003
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
Unhappy consulta revelde!

Hola!

Necesito hacer una consulta para obtener el nº total de artículos vendidos en Tickets, Facturas y Total (Tickets+Facturas), para ello uso esta consulta:
Código PHP:
SELECT 'TotalFactura'Sum(df.cantidad) as Totales
FROM detallesFactura 
AS dfarticulos AS a
WHERE 
(a.Marca='84-8431-594-0') AND ((df.id_articulo=a.id_articulo))
GROUP BY a.Marca

UNION 

SELECT 
'TotalTicket'Sum(dt.cantidad) as Totales
FROM detallesTicket 
AS dtarticulos AS a
WHERE 
(a.Marca='84-8431-594-0') AND ((dt.id_articulo=a.id_articulo))
GROUP BY a.Marca

UNION SELECT 
'Total'Sum(dt.cantidad)+Sum(df.cantidad)
FROM detallesTicket AS dtdetallesFactura AS dfarticulos AS a
WHERE  
(a.Marca='84-8431-594-0') AND ((df.id_articulo=a.id_articulo) OR (dt.id_articulo=a.id_articulo)); 
El problema está en que me obtiene correctamente los valores de TotalTicket y TotalFactura, pero en Total me obtiene valores mucho mayores al real, por ejemplo:
TotalFactura = 16
TotalTicket = 1
Total = 333

Una de dos, o el bicho este no sabe sumar o yo hago algo mal

musas asias
Responder Con Cita
  #2  
Antiguo 03-09-2003
Aprendiz Aprendiz is offline
Miembro
 
Registrado: may 2003
Posts: 78
Poder: 22
Aprendiz Va por buen camino
Hola de nuevo.

A ver llegados a este punto solo veo dos soluciones posibles.

1.- Que te crees un Procedimiento almacenado. Es la que te recomiendo, con lo cual no tendrás problemas de tener que hacerlo todo en una sola consulta con unions. De hecho con las dos primeras ya basta y la tercera la puedes hacer como suma de las variables que recojan los valores de las dos primeras.

2.- Crearte una consulta anidad, no me gusta mucho pero funciona, de este estilo.

SELECT 'TOTAL', (SELECT Sum(df.cantidad)
FROM detallesFactura AS df, articulos AS a
WHERE (a.Marca='84-8431-594-0') AND ((df.id_articulo=a.id_articulo)))
+
(SELECT Sum(dt.cantidad)
FROM detallesTicket AS dt, articulos AS a
WHERE (a.Marca='84-8431-594-0') AND ((dt.id_articulo=a.id_articulo))
)
FROM detallesFacturas

PD: Creo que el GROUP BY te sobra en las consultas. Más que nada por que ya le estás forzando en el WHERE a que sea una determinada.

PD2: Creo recordar que utilizabas Interbase, corrigeme si me equivoco, te lo digo por que en vez de enlazar con la tabla de artículos como lo haces yo lo haría en el FROM con clausulas INNER. Es más efectivo y eficiente.

Saludos
__________________
[Aprendiz]: Por que siempre hay algo nuevo que aprender.
Responder Con Cita
  #3  
Antiguo 03-09-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Buenos Días, prueba cambiando lo siguiente:

.........
SELECT 'Total', Sum(dt.cantidad+df.cantidad)
FROM detallesTicket AS dt, detallesFactura AS df, articulos AS a
WHERE (a.Marca='84-8431-594-0') AND ((df.id_articulo=a.id_articulo) OR (dt.id_articulo=a.id_articulo));

Un saludo.
Responder Con Cita
  #4  
Antiguo 03-09-2003
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
Hola de nuevo
Cita:
.........
SELECT 'Total', Sum(dt.cantidad+df.cantidad)
FROM detallesTicket AS dt, detallesFactura AS df, articulos AS a
WHERE (a.Marca='84-8431-594-0') AND ((df.id_articulo=a.id_articulo) OR (dt.id_articulo=a.id_articulo));
asi me sigue pasando los mismo que antes, me da valores muy superiores a los reales.

Uso access, Aprendiz; usando la consulta anidada sí me obtiene el valor real, lo que pasa que no veas como queda la consulta de liosa

La siguiente consulta obtiene los valores que buscaba
Código PHP:
SELECT 'TotalFactura'Sum(df.cantidad) as Totales
FROM detallesFactura 
AS dfarticulos AS a
WHERE 
(a.Marca='84-8431-594-0') AND ((df.id_articulo=a.id_articulo))

UNION 

SELECT 
'TotalTicket'Sum(dt.cantidad)
FROM detallesTicket AS dtarticulos AS a
WHERE 
(a.Marca='84-8431-594-0') AND ((dt.id_articulo=a.id_articulo))

UNION 

SELECT 
'TOTAL', (SELECT Sum(df.cantidad
FROM detallesFactura AS dfarticulos AS a
WHERE 
(a.Marca='84-8431-594-0') AND ((df.id_articulo=a.id_articulo)))+(SELECT Sum(dt.cantidad)
FROM detallesTicket AS dtarticulos AS a
WHERE 
(a.Marca='84-8431-594-0') AND ((dt.id_articulo=a.id_articulo)))
FROM detallesFactura
Lo del GROUP BY a.marca se coló por hay, era de unas pruebillas que hice anteriormente

Muchas gracias los dos por la ayuda

Salu2
Responder Con Cita
  #5  
Antiguo 04-09-2003
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
Question

La consulta anterior funciona al pelo.. siempre que haya artículos de la marca indicada en AMBAS tablas! si en alguna de ellas no hay artículos de la marca indicada nos devuelve como resultado NULL! me imagino que sera porque el resultado de NULL+valor=NULL, pero no lo tengo muy claro. :

Si fuera ese el problema, ¿Cómo podría hacer para que en vez de NULL la consulta me devolviese 0 en caso de no encontrar ningún registro?
Responder Con Cita
  #6  
Antiguo 04-09-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Buenos Días, como estas utilizando Access puedes utilizar la siguiente sentencia:

En el campo que puede que te de NULL pones lo siguiente:

IIf([campo]=NULL,0,[campo])

En tu caso:

SELECT 'TotalFactura', iif(Sum(df.cantidad)=NULL,0,Sum(df.cantidad)) as Totales
FROM detallesFactura AS df, articulos AS a
WHERE (a.Marca='84-8431-594-0') AND ((df.id_articulo=a.id_articulo))

UNION

SELECT 'TotalTicket', iif(Sum(dt.cantidad)=NULL,0,Sum(dt.cantidad))
FROM detallesTicket AS dt, articulos AS a
WHERE (a.Marca='84-8431-594-0') AND ((dt.id_articulo=a.id_articulo))

UNION

SELECT 'TOTAL', (SELECT iif(Sum(df.cantidad)=NULL,0,Sum(df.cantidad))
FROM detallesFactura AS df, articulos AS a
WHERE (a.Marca='84-8431-594-0') AND ((df.id_articulo=a.id_articulo)))+(SELECT iif(Sum(dt.cantidad)=NULL,0,Sum(dt.cantidad))
FROM detallesTicket AS dt, articulos AS a
WHERE (a.Marca='84-8431-594-0') AND ((dt.id_articulo=a.id_articulo)))
FROM detallesFactura;

No la he probado, pero debe funcionar. Un saludo.
Responder Con Cita
  #7  
Antiguo 04-09-2003
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
gracias por responder tan rapido

No me funciona, me sigue devolviendo NULL y por tanto no hace la suma correctamente.

Por ejemplo, para simplificar, imagina que tengo una tabla con 2 campos cantidad(Entero) y nombre(texto) con los siguientes datos:

nombre cantidad
a --------- 5
a --------- 2
b --------- 4
b ---------- 2

si le aplicamos la siguiente consulta el resultado sería 7
Código PHP:
SELECT 'Total' as tituloiif(SUM(cantidad)=NULL,0,SUM(cantidad)) as Total
FROM temporal
WHERE nombre
='a'
si cambiase la condición de nombre='a' por nombre='c' se supone que el resultado sería 0, pero en vez de eso, me devuelve un valor nulo, la verdad que esto me trae ya un poco de cabeza, por que necestio hacerlo para realizar estadísticas de ventas y tal, a ver si tengo un poco suerte:P

muchas gracias de nuevo
Responder Con Cita
  #8  
Antiguo 04-09-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Hola de nuevo, acabo de probar de manera muy simple la consulta, utilizando una tabla con dos campos nombre y cantidad. La tabla tiene los siguientes datos:

Código:
nombre  cantidad
a             2
a             5
b             3
y la sql, para asegurarme que no me devuelve cero por null o cosas similares, le he dicho que me devuelva 99 cuando no tenga nada

Código:
SELECT iif(sum(can)=NULL,99,sum(can))
FROM kk
where nombre='c'
en el caso de la "c", me devuelve 99, incluso lo he probado con el 0 en lugar del 99 y tambien me lo da correcto. No comprendo que te puede estar pasando.

Un saludo.
Responder Con Cita
  #9  
Antiguo 04-09-2003
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
Lightbulb

olé!!

ya funciona esto!! es fallo estaba en sum(can)=NULL asi no me funciona, pero si pongo sum(can) IS NULL sip!

muchisimas grasias si alguna vez venis para badajoz os debo por lo menos a 15 servesillas

salu2
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:15:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi