Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Consulta entre dos tablas

Estas en el tema de Consulta entre dos tablas en el foro de Oracle en Foros del Web. Hola tengo dos tablas que quiero realizar una consulta que me vaya arrastrando el campo(como un acumulado) y no hay manera. Os pongo lo que ...
  #1 (permalink)  
Antiguo 28/09/2012, 05:02
Avatar de triqui  
Fecha de Ingreso: diciembre-2008
Ubicación: Zaragoza(España)
Mensajes: 624
Antigüedad: 16 años
Puntos: 31
Consulta entre dos tablas

Hola tengo dos tablas que quiero realizar una consulta que me vaya arrastrando el campo(como un acumulado) y no hay manera.

Os pongo lo que estoy intentando hacer y la consulta que tengo hasta el momento. pero no hay manera

Tengo dos tablas, fact_cost con unas fechas

Select Fecha from fact_cost

20110601
20110701
20110801
20110901
20111001
20111101
20111201
20120101
20120201
20120301

Y tabla FACT_STOCK_ACUM_TEMP_MONTH con dos registros

20111001 20700
20111201 8400



select a.sk_dim_time,MAX(b.trqt_acum) From fact_cost A
LEFT join FACT_STOCK_ACUM_TEMP_MONTH B
on A.sk_dim_time = B.sk_dim_time
where A.sk_dim_time <> -1
group by a.sk_dim_time
order by a.sk_dim_time


Esto me da como resultado:


20110601
20110701
20110801
20110901
20111001 20700
20111101
20111201 8400
20120101
20120201
20120301


Pero el resultado esperado es el siguiente:

20110601
20110701
20110801
20110901
20111001 20700
20111101 20700
20111201 8400
20120101 8400
20120201 8400
20120301 8400

Muchas gracias !!
__________________
La nueva red social de quinielas quiniela resultados
Cazaresultados Futbol base en directo
  #2 (permalink)  
Antiguo 29/09/2012, 08:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta entre dos tablas

Cita:
Pero el resultado esperado es el siguiente:

20110601
20110701
20110801
20110901
20111001 20700
20111101 20700
20111201 8400
20120101 8400
20120201 8400
20120301 8400
Pues ese resultado es imposible en el contexto de los datos que tienes.

Dadas las condiciones del LEFT JOIN y del WHERE (y no veo como puedes tener un -1 en ese campo):
Código SQL:
Ver original
  1. SELECT a.sk_dim_time,MAX(b.trqt_acum)
  2. FROM fact_cost A LEFT JOIN FACT_STOCK_ACUM_TEMP_MONTH B
  3.     ON A.sk_dim_time = B.sk_dim_time
  4. WHERE A.sk_dim_time <> -1
  5. GROUP BY a.sk_dim_time
  6. ORDER BY a.sk_dim_time
sólo tienes dos registros en que ambas tablas coinciden, y son los que te devuelve. En el resto, al no haber coincidencias, devuelve nulos.

¿Tienes claro que un LEFT JOIN devuelve NULL en la segunda tabla, cuando no hay coincidencias?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 01/10/2012, 02:29
Avatar de triqui  
Fecha de Ingreso: diciembre-2008
Ubicación: Zaragoza(España)
Mensajes: 624
Antigüedad: 16 años
Puntos: 31
Respuesta: Consulta entre dos tablas

Hola gnzsoloyo, gracias por tu respuesta.

La condición where no le hagamos mucho caso, se la quito, la sql quedaría así:

Código SQL:
Ver original
  1. SELECT a.sk_dim_time,MAX(b.trqt_acum) FROM fact_cost A
  2.    LEFT JOIN FACT_STOCK_ACUM_TEMP_MONTH B
  3.    ON A.sk_dim_time = B.sk_dim_time
  4.   GROUP BY a.sk_dim_time
  5.   ORDER BY a.sk_dim_time;


En fact cost tengo una sola columna (sk_dim_time), que es una fecha y me devuelve.

20110601
20110701
20110801
20110901
20111001
20111101
20111201
20120101
20120201
20120301

Por otro lado tengo otra tabla FACT_STOCK_ACUM_TEMP_MONTH que tiene otra fecha(que utilizaremos para unir) y una cantidad(trqt_acum).

sk_dim_time trqt_acum
20111001 20700
20111201 8400


Al hacer el cruce con el left join me sale lo siguiente:

sk_dim_time trqt_acum
20110601 NULL
20110701 NULL
20110801 NULL
20110901 NULL
20111001 20700
20111101 NULL
20111201 8400
20120101 NULL
20120201 NULL
20120301 NULL

Realmente es un resultado esperado, Pero para lograr lo que quiero hacer, estoy probando con este tipo de sql

select a.sk_dim_time,
Sum(b.trqt_acum) over (order by a.sk_dim_time)
From fact_cost A
LEFT join FACT_STOCK_ACUM_TEMP_MONTH B
on A.sk_dim_time = B.sk_dim_time
order by a.sk_dim_time;


Este es el resultado que me ofrece

sk_dim_time trqt_acum
20110601 NULL
20110701 NULL
20110801 NULL
20110901 NULL
20111001 20700
20111101 20700
20111201 29100
20120101 29100
20120201 29100
20120301 29100

Pero claro lo que he marcado el rojo me hace una suma acumulada, donde pone 29100 debería salir 8400.

No se si me explicado bien pero el resultado debería de ser:


20110601 NULL
20110701 NULL
20110801 NULL
20110901 NULL
20111001 20700 <-- El valor natural
20111101 20700 <-- Cuando es nulo, el ultimo valor
20111201 8400 <-- El valor natural
20120101 8400 <-- Cuando es nulo, el ultimo valor
20120201 8400 <-- Cuando es nulo, el ultimo valor
20120301 8400 <-- Cuando es nulo, el ultimo valor
__________________
La nueva red social de quinielas quiniela resultados
Cazaresultados Futbol base en directo

Última edición por triqui; 01/10/2012 a las 02:40
  #4 (permalink)  
Antiguo 01/10/2012, 03:11
Avatar de triqui  
Fecha de Ingreso: diciembre-2008
Ubicación: Zaragoza(España)
Mensajes: 624
Antigüedad: 16 años
Puntos: 31
Respuesta: Consulta entre dos tablas

Bueno al final pude.


Pego la sql

Código SQL:
Ver original
  1. SELECT a.sk_dim_time
  2.       , last_value(b.trqt_acum IGNORE NULLS) OVER (
  3.            ORDER BY a.sk_dim_time
  4.           ROWS BETWEEN unbounded preceding AND CURRENT ROW
  5.          ) trqt
  6.     FROM fact_cost a
  7.     LEFT OUTER JOIN fact_stock_acum_temp_month b
  8.       ON a.sk_dim_time = b.sk_dim_time
  9.    ORDER BY a.sk_dim_time
__________________
La nueva red social de quinielas quiniela resultados
Cazaresultados Futbol base en directo

Etiquetas: fecha, select, tabla, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:43.