SQL - Sentencia SQL - Nueva Tabla

 
Vista:
sin imagen de perfil

Sentencia SQL - Nueva Tabla

Publicado por Cristian (5 intervenciones) el 24/11/2014 20:34:45
Buenas Tardes

Solicito ayuda a ustedes con el sigueinte tema...


Estoy tratando de crear una sentencia sql que me genere una nueva tabla, tengp 3 tablas con la data como se ve en la siguiente imagen:

SQL


mi objetivo, es crear una tabla que contenga los sigueintes datos:

SQL1

La sentencia sql que uso para hacer el procedimiento es esta :

1
2
3
4
5
6
SELECT distinct
idTarea, idTipo, Nombre_Tarea, Nombre_Proyecto, Descripcion, FechaI, FechaF, (select spi from spi a, tareas_com b where a.idTarea = b.idTarea) SPI, (select cpi from cpi a, tareas_com b where a.idTarea = b.idTarea) CPI
from
tareas_com
WHERE
idTipo = 'FP'

RESULTADO DE LA SENTENCIA

1 FP djdjj djdjsj dkkaka 2015-02-02 2015-02-25 105 0
2 FP BBBBB CCCCC DDDD 2014-02-02 2014-05-25 105 0

pero no estoy seguro, si es que estoy haciendo algo mal en la sentencia, y que si solo lo hago uniendo las tablas, o uniendo las sentencias, el me va a clonar los datos, es decir, colocara el valor de SPI, de la identificacion 1, y se lo colocara como SPI, de los siguientes registros hacia abajo, ya que no existen mas en la base de datos, el los clona y los coloca hay,

Solicito ayuda a ustedes con el fin de generar un resultado igual al que se ve como TABLA PRINCIPAL, claro, exeptuando el registro de AP.

Muchas gracias de antemano.
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Sentencia SQL - Nueva Tabla

Publicado por leonardo_josue (1173 intervenciones) el 24/11/2014 21:03:13
Hola Cristian:

Si bien el uso de subconsultas te puede ayudar a obtener el resultado esperado, en realidad estás malgastando esfuerzo y la respuesta es más simple de lo que parece.

Como dice el dicho: hay muchas formas de matar una mosca, pero utilizar una pistola resulta demasiado.

En tu caso, lo único que tienes que hacer es utilizar JOIN's, más especificamente LEFT JOIN. Si no sabes como funcionan estos en SQL, siempre puedes pedirle ayuda a Santa Wikipedia:

http://es.wikipedia.org/wiki/Join

Ahora bien, hay un pequeño problema, pues el LEFT JOIN pondría NULL en aquellos casos donde no exista correspondencia con los registros de tu tabla_com, y si entiendo bien tú necesitas poner ceros. La mayoría de los DBMS's proporcionan funciones específicas para este tipo de sustituciones, así MySQL tiene la función IFNULL, ORACLE la función NVL y así con todos. En el peor de los casos podrías utilizar un CASE-WHEN, que sería la forma "estándar" para hacer esta sustitución. No nos dices en tu post con qué BD's estás trabajando, pero es cuestión sólo de que investigues cuál es la función que te puede servir al respecto.

Haz la prueba y nos comentas si sigues teniendo problemas.

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
sin imagen de perfil

Sentencia SQL - Nueva Tabla

Publicado por Cristian (5 intervenciones) el 24/11/2014 21:59:31
Men de verdad muchisimas gracias, tenias la razon, con un left join es mucho mas facil de hacer, la verdad es que me mataba la cabeza intentando algo que ya habia hecho, pero que aca no me funcionaba, lo que hice fue hacerlo con lef join, y en la sentencia de condicion colocar el isnull. Tenias razon , ya que con el left join, me dejaba las valores como null, pero colocando la funcion isnull() (MySQL), ya esa tamando los valores en 0, y todo esta funcionando perfectamente.

este es el codigo que use

1
2
3
4
5
select tareas_com.idTarea, tareas_com.idTipo, tareas_com.Nombre_Tarea, tareas_com.Nombre_Proyecto, tareas_com.Descripcion, tareas_com.FechaI, tareas_com.FechaF, ifnull(spi.spi,0) spi, ifnull(cpi.cpi,0)
from tareas_com left join spi on spi.idTarea = tareas_com.idTarea  left join cpi on cpi.idTarea = tareas_com.idTarea
where tareas_com.idTipo = 'FP'
and (spi.idTipo = 'FP' or spi.idTipo is null)
and (cpi.idTipo = 'FP' or spi.idTipo is null)


Pero para entender un poco mejor, y ya que tu conoces del tema, queria preguntarte, esta sentencia la hice hace poco, genera una tabla nueva, y genera los promediados de una tabla llamada spi, dependiendo de su mes.
En este sentencia, los valores de 0 ya vienen por defecto, solo genera 1 row, y lo que genera es el promediado mensual de todo lo que haya en la tabla SPI. Esta tabla coloca los valores en 0, asi no existan en la tabla SPI. Esta sentencia la genere yo, pero aunquela cree, no entiendo porque esta misma logica no me funciono tratando de hacer el procedimiento que pregunte aca.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
SELECT 'Ejecución de Cronograma (SPI)' KPI, SUM(Enero) Enero, SUM(Febrero) Febrero, SUM(Marzo) Marzo, SUM(Abril) Abril, SUM(Mayo) Mayo, SUM(Junio) Junio, SUM(Julio) Julio, SUM(Agosto) Agosto, SUM(Septiembre) Septiembre, SUM(Octubre) Octubre, SUM(Noviembre) Noviembre, SUM(Diciembre) Diciembre , SUM(PROMEDIOFINAL) PROMEDIOFINAL
FROM (
SELECT NomProy, AVG(SPI) Enero, 0 Febrero, 0 Marzo, 0 Abril, 0 Mayo, 0 Junio, 0 Julio, 0 Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 1
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, AVG(SPI) Febrero, 0 Marzo, 0 Abril, 0 Mayo, 0 Junio, 0 Julio, 0 Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 2
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, AVG(SPI) Marzo, 0 Abril, 0 Mayo, 0 Junio, 0 Julio, 0 Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 3
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, AVG(SPI) Abril, 0 Mayo, 0 Junio, 0 Julio, 0 Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 4
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, 0 Abril, AVG(SPI) Mayo, 0 Junio, 0 Julio, 0 Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 5
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, 0 Abril, 0 Mayo, AVG(SPI) Junio, 0 Julio, 0 Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 6
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, 0 Abril, 0 Mayo, 0 Junio, AVG(SPI) Julio, 0 Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 7
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, 0 Abril, 0 Mayo, 0 Junio, 0 Julio, AVG(SPI) Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 8
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, 0 Abril, 0 Mayo, 0 Junio, 0 Julio, 0 Agosto, AVG(SPI) Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 9
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, 0 Abril, 0 Mayo, 0 Junio, 0 Julio, 0 Agosto, 0 Septiembre, AVG(SPI) Octubre, 0 Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 10
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, 0 Abril, 0 Mayo, 0 Junio, 0 Julio, 0 Agosto, 0 Septiembre, 0 Octubre, AVG(SPI) Noviembre, 0 Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 11
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, 0 Abril, 0 Mayo, 0 Junio, 0 Julio, 0 Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, AVG(SPI) Diciembre, 0 PROMEDIOFINAL
FROM SPI
WHERE Mes= 12
AND Año = 2014
UNION ALL
SELECT NomProy, 0 Enero, 0 Febrero, 0 Marzo, 0 Abril, 0 Mayo, 0 Junio, 0 Julio, 0 Agosto, 0 Septiembre, 0 Octubre, 0 Noviembre, 0 Diciembre, AVG(SPI) PROMEDIOFINAL
FROM SPI
WHERE Año = 2014
) KPIjulian

si pudieses hacerme entender un poco mejor el porque te lo agradeceria mucho, Y NUEVAMENTE GRACIAS POR TU AYUDA.
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