PDA

Ver la Versión Completa : Otro sql que no sale


ctronx
07-01-2005, 18:56:20
Saludos, tengo dos tablas con los mismo campos

tabla: ventasr
vendedor
fecha
total

tabla:ventasf
vendedor
fecha
total

necesito obtener el siguiente listado:
ejemplo:
Vendedor Fecha TotalR TotalF
1 01/01/05 3500 4100
2 02/01/05 0 350
3 03/01/05 5200 0

Los ceros del ejemplo los puse porque se puede dar el caso que un vendedor tenga ventas en la tabla "ventasr" pero no en la tabla "ventasf" y al reves.
Espero me puedan ayudar, de antemano muchas gracias.

Oxa78
07-01-2005, 19:10:35
Saludos :

Es importante que indiques con q motor de Base de Datos trabajas, pero te asistire con una sentencia que podria aplicarse en SQL Server 2000, DB2 y talves en Oracle.

En primer lugar, deberías partir de la tabla de vendedores para obtener el resultado q quieres :

tabla: ventasr
vendedor (Codigo de vendedor)
fecha
total

tabla:ventasf
vendedor (Codigo de vendedor)
fecha
total

tabla : vendedor
vendedor (codigo de vendedor)
vend_nombre

tonces :

SELECT W.VENDEDOR, MAX(W.VEND_NOMBRE) VEND_NOMBRE,
W.FECHA, SUM(W.TOTALR) TOTALR, SUM(W.TOTALF) TOTALF
FROM (
SELECT A.VENDEDOR, MAX(A.VEND_NOMBRE) VEND_NOMBRE,
B.FECHA, SUM(TOTAL) TOTALR, 0 TOTALF
FROM VENTASR A
LEFT JOIN VENTASR B ON (B.VENDEDOR=A.VENDEDOR)
GROUP BY A.VENDEDOR, B.FECHA
UNION
SELECT A.VENDEDOR, MAX(A.VEND_NOMBRE) VEND_NOMBRE,
B.FECHA, 0 TOTALR, SUM(TOTAL) TOTALF
FROM VENTASF A
LEFT JOIN VENTASF B ON (B.VENDEDOR=A.VENDEDOR)
GROUP BY A.VENDEDOR, B.FECHA
) W
GROUP BY W.VENDEDOR, W.FECHA

Espero q sirva...

ctronx
07-01-2005, 23:07:04
Gracias, Utilizo Mysql, voy a probar tu sugerencia haber como me sale.

ctronx
07-01-2005, 23:51:13
No me sale me da un error de sintaxis.

Oxa78
08-01-2005, 00:18:39
Q pena nunca trabaje con MySQL, seguramente no soporta la instruccion,
lo que se por ejemplo es q esta instrucción no corre en InterBase OpenSource.

Lo que puedes hacer es correr esta instrucción en un ClientDataSet :


SELECT A.VENDEDOR, MAX(A.VEND_NOMBRE) VEND_NOMBRE,
B.FECHA, SUM(TOTAL) TOTALR, 0 TOTALF
FROM VENTASR A
LEFT JOIN VENTASR B ON (B.VENDEDOR=A.VENDEDOR)
GROUP BY A.VENDEDOR, B.FECHA
UNION
SELECT A.VENDEDOR, MAX(A.VEND_NOMBRE) VEND_NOMBRE,
B.FECHA, 0 TOTALR, SUM(TOTAL) TOTALF
FROM VENTASF A
LEFT JOIN VENTASF B ON (B.VENDEDOR=A.VENDEDOR)
GROUP BY A.VENDEDOR, B.FECHA


Luego Ejecutas esta instrucción SQL vacia en otro ClientDataSet :


SELECT '' '' VENDEDOR,
'' '' VEND_NOMBRE,
NULL FECHA, 0.00 TOTALR, 0.00 TOTALF
FROM VENTASR A
WHERE A.VENDEDOR=''ABCDSR''


El VENDEDOR=''ABCDSR'' No existe la idea es tener un ClientDataSet vacio, pero con la estructura necesaria para llenar los datos.

Finalmente recorres el primer ClientDataSet a traves de código de Delphi, es decir en un While recorres los registros y vas totalizando segun tus condiciones. Esta operación te demandara mas pero massss trabajo, que una simple instrucción. Que pena...

Espero que puedas realizarlo, parece que es el unico camino si es que tu motor SQL no soporta la instrucción.

PD: En la isntruccion anterior habia un error no tenia "FROM", pero ya esta corregido.

ctronx
08-01-2005, 02:30:36
Me sigue marcando error, voy a probar poniendo menos campos de la siguiente manera:

tabla:ventasR
fecha
total

tabla.ventasF
fecha
total

ejemplo del resultado que quiero:


fecha totalR totalF
01/01/05 2500 0
02/01/05 0 3600
03/01/05 652 0


Espero me puedas o me puedan ayudar sugiriendome algun codigo sql que necesito, de antemano gracias. (utilizo mysql).

Tony_G
09-01-2005, 20:50:47
Hola.

Creo que tu problema se puede resolver de la siguiente forma:

1º Te creas una tabla 'tablax' con la siguiente estructura:
- vendedor
- fecha
- totalf
- totalr

2º Haces las siguientes consultas:

INSERT INTO tablax SELECT vendedor,fecha,0 AS totalf,totalr FROM ventasr;

INSERT INTO tablax SELECT vendedor,fecha,totalf,0 AS totalr FROM ventasf;

SELECT vendedor,fecha,SUM(totalf),SUM(totalr) FROM tablax GROUP BY vendedor,fecha;

Si lo que quieres es hacerlo todo en una sola sentencia --> no sé si se puede hacer, pero en el caso de que se pudiera tendrías que evaluar la rapidez.

Espero que te sirva.

Saludos.

Oxa78
10-01-2005, 15:03:22
Saludos : La solución de Tony__G parece ser la mas adecuada, crear una tabla temporal (TablaX) es la solucion.