SQL - Consultas sumas condicionales

   
Vista:

Consultas sumas condicionales

Publicado por Juan Pedro (4 intervenciones) el 27/04/2015 19:09:46
Buenas tardes a tod@s,

Quiero hacer una consulta en la que consten diferentes sumatorios en funcion de condiciones de tablas relacionadas:
De un elemento fabricado que tiene diferentes piezas que se montan en un taller o en obra quiero sacar una consulta que diga: Elemento, piezas en taller, piezas en obra, piezas ya montadas en taller, piezas ya montadas en obra.
Seria un resumen productivo.
El caso es que puedo realizar las consultas por separado, pero al unirlas en otra consulta simple provoca un error.

Espero haberme expresado con claridad.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Consultas sumas condicionales

Publicado por leonardo_josue (877 intervenciones) el 27/04/2015 19:19:11
Hola Juan Pedro:

Antes que nada, hay que aclarar algunos puntos:

1. ¿Con qué Base de Datos estás trabajando?, aunque la mayoría de los DBMS's se basan en SQL, hay diferencias importantes en cuanto a la sintaxis entre cada una de ellos, por lo tanto resulta algo complicado tratar de darte una respuesta puntual.

2. ¿Cuál es la estructura de tus tablas y cómo están relacionadas? es decir, para ti puede resultar bastante clara la explicación, pero nosotros NO CONOCEMOS TU MODELO DE DATOS, por lo tanto NO SABEMOS DE DONDE DIABLOS OBTENEMOS LA INFORMACIÓN QUE NECESITAS. Postea la estructura de tu tablas o tablas y postea algunos datos de ejemplo, a partir de esos datos dinos qué es lo que esperas obtener como resultado.

3. La pregunta más importante de todas: ¿Qué es lo que has intentado hacer? Por un lado mencionas que obtuviste la información por separado y que al tratar de unirla provocaste un error, pero ¿Qué error es el que estás obteniendo?

Postea el código de lo que hayas intentado hacer (no importa si está incompleto o erroneo. En caso de los errores, POSTEA LOS CÓDIGOS O LOS MENSAJES QUE TE ARROJA EL DBMS. Entre más detalles nos puedas dar de tu problema más factible será que podamos ayudarte.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas sumas condicionales

Publicado por Juan Pedro (4 intervenciones) el 27/04/2015 19:35:16
Tablas
Gracias Leo, detallo más.
La base de datos es en Access 2007
Estas son las tablas que utilizo y a continuacion una sentencia que funciona:

* Aquí sumo los valores con unas caracteristicas.

SELECT Proyecto.Id_Proyecto, Isometricos.Nombre, Sum(Diametros.Numero*Espesor.Coeficiente) AS PulgadasFabricacion
FROM TipoUnion INNER JOIN ((Proyecto INNER JOIN Isometricos ON Proyecto.Id_Proyecto = Isometricos.Id_Proyecto) INNER JOIN ((Diametros INNER JOIN Espesor ON Diametros.Id_Diametro = Espesor.Id_Diametro) INNER JOIN Uniones ON Espesor.Id_Espesor = Uniones.Id_Espesor) ON Isometricos.Id_Nombre = Uniones.Id_Isometrico) ON TipoUnion.Id_TipoUnion = Uniones.Id_TipoUnion
WHERE (((TipoUnion.Fabricacion)=True) AND ((TipoUnion.Soldada)=True))
GROUP BY Proyecto.Id_Proyecto, Isometricos.Nombre, Espesor.Coeficiente;

En otra consulta hago lo mismo pero cambiando WHERE (((TipoUnion.Fabricacion)=True) AND ((TipoUnion.Soldada)=True))

Para cada una de las consultas quiero saber cuantas tienen un valor en ProdT y ProdS para sumar los diametros en los que existe produccion, osea registro.
Pues bien, la union de todas ellas quiero que sea una sola consulta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas sumas condicionales

Publicado por leonardo_josue (877 intervenciones) el 27/04/2015 22:15:58
Hola de nuevo Juan Pedro:

No me queda del todo claro qué es lo que estás esperando como salida, quizás si incluyes algunos datos de ejemplo podría ser más fácil, sin embargo, creo entender más o menos lo que quieres hacer y esto puede que te sirva...

Hay una manera de hacer SUMAS CONDICIONALES en SQL, pero no sé si esto sea realmente lo que quieras, te muestro un ejemplo para ver cómo sería más o menos.

El ejemplo lo pongo con MySQL, pero la idea sería la misma, supongamos que tenemos una tabla así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT * FROM tabla;
+------+----------+--------+
| id   | operador | tipo   |
+------+----------+--------+
|    1 | Hugo     | tipo 1 |
|    2 | Hugo     | tipo 2 |
|    3 | Hugo     | tipo 2 |
|    4 | Hugo     | tipo 2 |
|    5 | Paco     | tipo 1 |
|    6 | Paco     | tipo 1 |
|    7 | Paco     | tipo 2 |
|    8 | Paco     | tipo 2 |
|    9 | Paco     | tipo 2 |
+------+----------+--------+
9 rows in set (0.00 sec)

Ahora, supongamos que queremos determinar cuántos elementos de cada tipo (1 o 2) hay por cada operador... esto podrías hacerlo así:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT operador, tipo, COUNT(*) total
    -> FROM tabla
    -> GROUP BY operador, tipo;
+----------+--------+-------+
| operador | tipo   | total |
+----------+--------+-------+
| Hugo     | tipo 1 |     1 |
| Hugo     | tipo 2 |     3 |
| Paco     | tipo 1 |     2 |
| Paco     | tipo 2 |     3 |
+----------+--------+-------+
4 rows in set (0.00 sec)

Ahora bien, hay otra forma de hacer esta sumatoria, y es colocar una SUMA con una condición, dependiendo del tipo, es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT operador,
    ->        SUM(1) total_registros,
    ->        SUM(IF (tipo = 'tipo 1', 1, 0)) total_tipo_1,
    ->        SUM(IF (tipo = 'tipo 2', 1, 0)) total_tipo_2
    -> FROM tabla
    -> GROUP BY operador;
+----------+-----------------+--------------+--------------+
| operador | total_registros | total_tipo_1 | total_tipo_2 |
+----------+-----------------+--------------+--------------+
| Hugo     |               4 |            1 |            3 |
| Paco     |               5 |            2 |            3 |
+----------+-----------------+--------------+--------------+
2 rows in set (0.00 sec)

Si entendí bien, lo que nos dices es que la única diferencia que hay entre tus dos consultas es el WHERE que colocas, entonces, si quisieras presentar la información de ambas consultas en una sola consulta, lo podrías hacer así, (en ACCESS, hasta donde recuerdo, el IF se maneja como IIF):

1
2
3
4
5
6
...
   SUM(IIF(TipoUnion.Fabricacion=TRUE AND TipoUnion.Soldada=TRUE,
           Diametros.Numero*Espesor.Coeficiente, 0) AS PulgadasFabricacion
   SUM(IIF(Aqui pones la otra condición,
           Diametros.Numero*Espesor.Coeficiente, 0) AS PulgadasMondatas
...

es decir, esto te debería de generar ambas columnas a la vez.

Haz la prueba y nos comentas si te sirvió el código, si continuas con problema insisto, postea algunos datos de ejemplo de tus tablas y dinos a manera de tabla (como lo hago al inicio) qué es lo que esperas obtener como salida.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Consultas sumas condicionales

Publicado por Juan Pedro (4 intervenciones) el 28/04/2015 19:47:11
Genial Leo, lo acabo de probar y una parte del problema esta solucionado, aun me queda la otra.
He utilizado los sumatorios condicionales, quedandome una sentencia así:

SELECT Proyecto.Id_Proyecto, Isometricos.Nombre, SUM(IIF(TipoUnion.Fabricacion=TRUE AND TipoUnion.Soldada=TRUE, Diametros.Numero*Espesor.Coeficiente, 0)) AS PulgadasFabricacion,
SUM(IIF(TipoUnion.Fabricacion=FALSE AND TipoUnion.Soldada=TRUE, Diametros.Numero*Espesor.Coeficiente, 0)) AS PulgadasMontaje
FROM TipoUnion INNER JOIN ((Proyecto INNER JOIN Isometricos ON Proyecto.Id_Proyecto = Isometricos.Id_Proyecto) INNER JOIN ((Diametros INNER JOIN Espesor ON Diametros.Id_Diametro = Espesor.Id_Diametro) INNER JOIN Uniones ON Espesor.Id_Espesor = Uniones.Id_Espesor) ON Isometricos.Id_Nombre = Uniones.Id_Isometrico) ON TipoUnion.Id_TipoUnion = Uniones.Id_TipoUnion
GROUP BY Proyecto.Id_Proyecto, Isometricos.Nombre, Espesor.Coeficiente;


Quedaría una salida:

Proyecto | Isometrico | PulgadasFabricacion | PulgadasMontaje|
1 | PL-32051 | 45 | 20 |
.....

La segunda parte es, hacer que la columna de la siguiente sentencia formara parte de la primera mediante una subconsulta o un sumatorio del estilo.

SELECT Sum(Diametros.Numero*Espesor.Coeficiente) AS SumaDeNumero, Proyecto.Id_Proyecto, Isometricos.Id_Nombre
FROM Proyecto INNER JOIN ((TipoUnion INNER JOIN (Isometricos INNER JOIN ((Diametros INNER JOIN Espesor ON Diametros.Id_Diametro = Espesor.Id_Diametro) INNER JOIN Uniones ON Espesor.Id_Espesor = Uniones.Id_Espesor) ON Isometricos.Id_Nombre = Uniones.Id_Isometrico) ON TipoUnion.Id_TipoUnion = Uniones.Id_TipoUnion) INNER JOIN ProdT ON Uniones.Id_Union = ProdT.Id_Union) ON Proyecto.Id_Proyecto = Isometricos.Id_Proyecto
GROUP BY Isometricos.Nombre, Proyecto.Id_Proyecto, Isometricos.Id_Nombre;


Espero tener una salida:


Proyecto | Isometrico | PulgadasFabricacion | PulgadasMontaje| Fabricadas | Montadas |
1 | PL-32051 | 45 | 20 | 45 | 5 |

.....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas sumas condicionales

Publicado por Juan Pedro (4 intervenciones) el 29/04/2015 13:02:47
Solucionado.

He puesto subconsultas para los otros datos, la pongo aqui por si alguien necesita el procedimiento.

SELECT Proyecto.Id_Proyecto, Isometricos.Nombre, Sum(IIf(TipoUnion.Fabricacion=True And TipoUnion.Soldada=True,Diametros.Numero*Espesor.Coeficiente*Especificaciones.Coeficiente,0)) AS PulgadasFabricacion, Sum(IIf(TipoUnion.Fabricacion=False And TipoUnion.Soldada=True,Diametros.Numero*Espesor.Coeficiente*Especificaciones.Coeficiente,0)) AS PulgadasMontaje, Sum(IIf(TipoUnion.Fabricacion=True And TipoUnion.Soldada=True And ProdT.Id_Union=Uniones.Id_Union,Diametros.Numero*Espesor.Coeficiente,0)) AS PulFabTub, Sum(IIf(TipoUnion.Fabricacion=False And TipoUnion.Soldada=True And ProdT.Id_Union=Uniones.Id_Union,Diametros.Numero*Espesor.Coeficiente,0)) AS PulMonTub, Sum(IIf(TipoUnion.Fabricacion=True And TipoUnion.Soldada=True And ProdS.Id_Union=Uniones.Id_Union,Diametros.Numero*Espesor.Coeficiente,0)) AS PulFabSold, Sum(IIf(TipoUnion.Fabricacion=False And TipoUnion.Soldada=True And ProdS.Id_Union=Uniones.Id_Union,Diametros.Numero*Espesor.Coeficiente,0)) AS PulMonSold
FROM (SELECT * FROM ProdT WHERE Fecha Between [?] And [?]) AS ProdT, (SELECT * FROM ProdS WHERE Fecha Between [?] And [?]) AS ProdS, TipoUnion INNER JOIN (Proyecto INNER JOIN ((Especificaciones INNER JOIN Isometricos ON Especificaciones.Id_Espec=Isometricos.Id_Espec) INNER JOIN ((Diametros INNER JOIN Espesor ON Diametros.Id_Diametro=Espesor.Id_Diametro) INNER JOIN Uniones ON Espesor.Id_Espesor=Uniones.Id_Espesor) ON Isometricos.Id_Nombre=Uniones.Id_Isometrico) ON Proyecto.Id_Proyecto=Isometricos.Id_Proyecto) ON TipoUnion.Id_TipoUnion=Uniones.Id_TipoUnion
GROUP BY Proyecto.Id_Proyecto, Isometricos.Nombre, Espesor.Coeficiente
HAVING Proyecto.Id_Proyecto=[?];
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar