PDA

Ver la Versión Completa : consulta revelde!


Er_Manué
03-09-2003, 02:09:57
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:
SELECT 'TotalFactura', 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))
GROUP BY a.Marca

UNION

SELECT 'TotalTicket', Sum(dt.cantidad) as Totales
FROM detallesTicket AS dt, articulos 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 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));

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:p

musas asias :)

Aprendiz
03-09-2003, 10:18:35
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

javiermorales
03-09-2003, 10:54:05
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.

Er_Manué
03-09-2003, 13:23:43
Hola de nuevo
.........
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:p

La siguiente consulta obtiene los valores que buscaba
SELECT 'TotalFactura', 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', 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 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 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

Er_Manué
04-09-2003, 09:05:25
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. ::confused:

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?

javiermorales
04-09-2003, 09:23:38
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.

Er_Manué
04-09-2003, 10:35:54
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
SELECT 'Total' as titulo, iif(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

javiermorales
04-09-2003, 10:48:59
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:


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


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.

Er_Manué
04-09-2003, 11:07:50
olé!!

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

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

salu2