totalizar valores, con 3 tablas!!

01/12/2007 - 04:40 por Oscar | Informe spam
Hola a todos,

he aquí mi problema->

Tengo tres tablas:

1.- Distribuidores: Tabla con Distribuidores y Cadenas
2.- Altas: Tabla con altas dedistribuidores
3.- Almacen:Tabla con almacen de distribuidores


Necesito obtener como resultado una tabla con el nombre del distribuidor, el
nombre de la cadena, el número de unidades en almacen y el numero de altas de un
día.


Lo consigo por separado, es decir el número de altas por distribuidor en un día:

Stock en almacen por distribuidor y cadena:

SELECT SUM(ALMACEN.ALMUNIDADES) AS UNIDADES, DISTRIBUIDOR.DISCADENA AS
CADENA, DISTRIBUIDOR.DISNOMBRE AS DISTRIBUIDOR
FROM ALMACEN RIGHT OUTER JOIN
DISTRIBUIDOR ON ALMACEN.ALMDISTRIBUIDOR =
DISTRIBUIDOR.DISNOMBRE AND ALMACEN.ALMCADENA = DISTRIBUIDOR.DISCADENA
GROUP BY DISTRIBUIDOR.DISCADENA, DISTRIBUIDOR.DISNOMBRE

Altas por distribuidor y cadena:

SELECT DISTRIBUIDOR.DISCADENA AS CADENA, DISTRIBUIDOR.DISNOMBRE AS
DISTRIBUIDOR, COUNT(ALTASDETALLE.ALTID) AS ALTAS
FROM DISTRIBUIDOR LEFT OUTER JOIN
ALTASDETALLE ON DISTRIBUIDOR.DISNOMBRE =
ALTASDETALLE.ALTDISTRIBUIDOR AND
DISTRIBUIDOR.DISCADENA = ALTASDETALLE.ALTCADENA
GROUP BY DISTRIBUIDOR.DISCADENA, DISTRIBUIDOR.DISNOMBRE


Pero soy incapaz de varias cosas:

1.º Si intento sacar las altas de un solo día:

SELECT DISTRIBUIDOR.DISCADENA AS CADENA, DISTRIBUIDOR.DISNOMBRE AS
DISTRIBUIDOR, COUNT(ALTASDETALLE.ALTID) AS ALTAS
FROM DISTRIBUIDOR LEFT OUTER JOIN
ALTASDETALLE ON DISTRIBUIDOR.DISNOMBRE =
ALTASDETALLE.ALTDISTRIBUIDOR AND
DISTRIBUIDOR.DISCADENA = ALTASDETALLE.ALTCADENA
WHERE (ALTASDETALLE.ALTFECHA = CONVERT(DATETIME, '15/11/2007', 103))
GROUP BY DISTRIBUIDOR.DISCADENA, DISTRIBUIDOR.DISNOMBRE, ALTASDETALLE.ALTFECHA

en lugar de lo 30 distribuidores que tengo, obtengo solo 11, no me calcula 0
para aquellos que no tienen altas, pero si que me calcula 0 en la selección
anterior sin la condición de fecha!!

2-º Soy incapaz de unir las dos consultas y obtener una tabla con

DISTRIBUIDOR CADENA UNIDADES_ALMACEN ALTAS


algun consejo??

Muchas gracias.

Oscar.

Preguntas similare

Leer las respuestas

#6 Oscar
01/12/2007 - 18:55 | Informe spam
Hola Carlos,

no tengo palabras, perfecto... aquí esta la solución...

SELECT ALM.DISNOMBRE, ALM.DISCADENA, ALM.UNIDADES, ALT.ALTAS
FROM (SELECT DISTRIBUIDOR.DISNOMBRE, DISTRIBUIDOR.DISCADENA,
COUNT(ALMACEN.ALMID) AS UNIDADES
FROM DISTRIBUIDOR LEFT OUTER JOIN
ALMACEN ON DISTRIBUIDOR.DISNOMBRE
= ALMACEN.ALMDISTRIBUIDOR AND
DISTRIBUIDOR.DISCADENA =
ALMACEN.ALMCADENA
GROUP BY DISTRIBUIDOR.DISNOMBRE, DISTRIBUIDOR.DISCADENA)
AS ALM INNER JOIN
(SELECT DISTRIBUIDOR_1.DISNOMBRE,
DISTRIBUIDOR_1.DISCADENA, COUNT(ALTASDETALLE.ALTID) AS ALTAS
FROM DISTRIBUIDOR AS DISTRIBUIDOR_1 LEFT
OUTER JOIN
ALTASDETALLE ON
DISTRIBUIDOR_1.DISNOMBRE = ALTASDETALLE.ALTDISTRIBUIDOR AND
DISTRIBUIDOR_1.DISCADENA =
ALTASDETALLE.ALTCADENA AND ALTASDETALLE.ALTFECHA = CONVERT(DATETIME,
'15/11/2007', 103)
GROUP BY DISTRIBUIDOR_1.DISNOMBRE,
DISTRIBUIDOR_1.DISCADENA) AS ALT ON ALM.DISNOMBRE = ALT.DISNOMBRE AND
ALM.DISCADENA = ALT.DISCADENA
ORDER BY ALM.DISCADENA, ALM.DISNOMBRE


he tenido algunos problemas con algunos distribuidores que tenien NULL en
DISCADENA, pero cambiandolo a blanco se ha solucionado

Ahora puedo controlar por programa (VB.net) la fecha y mi consulta para ASP.NET
que niquelada!!!


AND ALTASDETALLE.ALTFECHA = CONVERT(DATETIME, " & FECHA.tostring & ", 103)


Lo dicho muchisimas gracias por tu tiempo y ayuda

voy a mirar lo del procedimiento almacenado que hace tiempo que tengo curiosidad


Creo que para ser sabado, los dos hemos currado demasiado!!

Saludos y muchas gracias de nuevo...

Óscar.

Carlos M. Calvelo escribió:
Hola Oscar,

On 1 dec, 14:52, Oscar wrote:
Una solución que encentro es la siguiente:

Vista1 -> Altas por Distribuidor y Cadena

SELECT dbo.DISTRIBUIDOR.DISCADENA AS CADENA, dbo.DISTRIBUIDOR.DISNOMBRE AS
DISTRIBUIDOR, COUNT(dbo.ALTASDETALLE.ALTID) AS ALTAS
FROM dbo.DISTRIBUIDOR LEFT OUTER JOIN
dbo.ALTASDETALLE ON dbo.DISTRIBUIDOR.DISNOMBRE >> dbo.ALTASDETALLE.ALTDISTRIBUIDOR AND
dbo.DISTRIBUIDOR.DISCADENA = dbo.ALTASDETALLE.ALTCADENA
AND dbo.ALTASDETALLE.ALTFECHA = CONVERT(DATETIME, '15/11/2007', 103)
GROUP BY dbo.DISTRIBUIDOR.DISCADENA, dbo.DISTRIBUIDOR.DISNOMBRE,
dbo.ALTASDETALLE.ALTFECHA

Vista2 -> Stock por Distribuidor y Cadena

SELECT SUM(dbo.ALMACEN.ALMUNIDADES) AS UNIDADES, dbo.DISTRIBUIDOR.DISCADENA
AS CADENA,
dbo.DISTRIBUIDOR.DISNOMBRE AS DISTRIBUIDOR
FROM dbo.ALMACEN RIGHT OUTER JOIN
dbo.DISTRIBUIDOR ON dbo.ALMACEN.ALMDISTRIBUIDOR >> dbo.DISTRIBUIDOR.DISNOMBRE AND
dbo.ALMACEN.ALMCADENA = dbo.DISTRIBUIDOR.DISCADENA
GROUP BY dbo.DISTRIBUIDOR.DISCADENA, dbo.DISTRIBUIDOR.DISNOMBRE

Vista conjunta:

SELECT dbo.VISTA_DISTRIBUIDOR_ALMACEN_UNI.UNIDADES,
dbo.VISTA_DISTRIBUIDOR_ALTAS_DIA.ALTAS,
dbo.VISTA_DISTRIBUIDOR_ALMACEN_UNI.CADENA,
dbo.VISTA_DISTRIBUIDOR_ALMACEN_UNI.DISTRIBUIDOR
FROM dbo.VISTA_DISTRIBUIDOR_ALMACEN_UNI LEFT OUTER JOIN
dbo.VISTA_DISTRIBUIDOR_ALTAS_DIA ON
dbo.VISTA_DISTRIBUIDOR_ALMACEN_UNI.CADENA >> dbo.VISTA_DISTRIBUIDOR_ALTAS_DIA.CADENA AND
dbo.VISTA_DISTRIBUIDOR_ALMACEN_UNI.DISTRIBUIDOR >> dbo.VISTA_DISTRIBUIDOR_ALTAS_DIA.DISTRIBUIDOR

Y asi obtengo justo lo que estoy buscando... una tabla con el nombre del
distribuidor, de la cadena y el total de unidades que tiene el almacen y el
total de altas del dia 15...

el problema, que no se como hacer para añadir que la condición del día sea
variable... es decir, que pueda elegir el día o intervalo de días en los que
realizar la consulta

:(




Pues puedes, por ejemplo, crear un procedimiento almacenado al que
le pasas las dos fechas y en la condición del left join del select
que te he dado en el otro post pones:

... AND ALTASDETALLE.ALTFECHA BETWEEN @FECHAINICO AND @FECHAFIN ...

Donde tiene que estar esa consulta? En la aplicación? En la base
de datos? (vista o procedimiento almacenado?)


Al final, no me quedará otra que realizar la tabla de manera dinámica, a través
de los dos select primeros, y hacer una tabla html a pelo... snif snif...




Esperemos que no llegen ahí las cosas :)

Saludos,
Carlos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida