SQL - ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

 
Vista:

ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

Publicado por EMMANUEL (5 intervenciones) el 22/06/2015 18:30:21
tengo una duda enorme.
primero los quiero ilustrar:
tengo una tabla q se actualiza cada 10 dias.
los campos son "fecha", "honorario" y " codigo"
si el codigo no cambio de honorario se crea una nueva linea con el mismo monto pero distinta fecha.

ahora bien mi consulta es la siguiente.

quiero que el sql me arroje una evolucion de los honorarios. ej:

[fecha] [codigo] [honorario]
01/01/15 asd1 1000
01/01/15 asd2 7000
01/01/15 asd3 9000
10/01/15 asd1 1000
10/01/15 asd2 8000
10/01/15 asd3 10000


yo quiero q al final solo me arroje cada codigo con la fecha en la que cambio el honorario

por ejemplo q el codigo asd2 cambio el 10 de enero a 8000
pero q el uyltimo cambio del asd1 fue el 1ro de enero. ...

no se si me explico
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

ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

Publicado por leonardo_josue (1173 intervenciones) el 22/06/2015 22:41:39
Hola Emmanuel:

Antes que nada deberías de aclararnos algunos puntos...

1. ¿Qué motor de BD's estás utilizando? este dato debes incluirlo siempre que publiques una pregunta, ya que aunque la mayoría de ellos está basado en SQL, hay diferencias importantes entre cada uno de ellos, así como manejo de funciones y/o fechas distintos.

2. ¿De qué tipo es tu campo fecha? puedo suponer que se trata de DATE o DATETIME, pero eso sólo Dios y tú lo sabes a ciencia cierta. Un terrible error que se suele cometer es manejar las fechas como VARCHAR.

3. veo que tienes muy claro qué es lo que quieres obtener, sin embargo, no veo que hayas mencionado nada de lo que intentaste hacer ( porque supongo que intentaste algo cierto?)... mucho ojo con eso, siempre debes incluir una muestra de lo que has intentado hacer... no importa que no funcione. Si la consulta que intentaste hacer marca error, entonces mencionas el error que te está marcando. Si la consulta que intentaste hacer no regresa los resultados esperados, entonces nos dices qué es lo que está regresando y qué es lo que debería estar regresando.

ahora bien, tienes muchas formas de resolver el problema que tienes... desde mi punto de vista, la lógica que debes simplemente tienes dos casos.

1. Si el código NO HA SUFRIDO CAMBIOS... En este caso SELECCIONAS la MINIMA fecha que tenga ese código.
2. Si el código HA SUFRIDO CAMBIOS, entonces SELECCIONAS la MAXIMA fecha ANTERIOR a la última fecha registrada y que tenga un monto distinto...

Todo esto lo puedes hacer con subconsultas. checa este código en MySQL.

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tabla;
+------------+--------+-----------+
| fecha      | codigo | honorario |
+------------+--------+-----------+
| 2015-01-01 | asd1   |      1000 |
| 2015-01-01 | asd2   |      7000 |
| 2015-01-01 | asd3   |      9000 |
| 2015-01-10 | asd1   |      1000 |
| 2015-01-10 | asd2   |      8000 |
| 2015-01-10 | asd3   |     10000 |
+------------+--------+-----------+
6 rows in set (0.00 sec)

Para determinar si un código ha sufrido variaciones o no:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT codigo, COUNT(DISTINCT honorario) cambios
    -> FROM tabla
    -> GROUP BY codigo;
+--------+---------+
| codigo | cambios |
+--------+---------+
| asd1   |       1 |
| asd2   |       2 |
| asd3   |       2 |
+--------+---------+
3 rows in set (0.00 sec)

Con esto se observa que el código = asd1 NO HA SUFRIDO NINGÚN CAMBIO, por lo tanto, obtenemos la mínima FECHA.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT T1.codigo, CASE T1.cambios
    ->                      WHEN 1 THEN (SELECT MIN(fecha)
    ->                                   FROM tabla T2
    ->                                   WHERE T1.codigo = T2.codigo)
    ->                   END ultimo_cambio
    -> FROM
    -> ( SELECT codigo, COUNT(DISTINCT honorario) cambios
    ->   FROM tabla
    ->   GROUP BY codigo) T1;
+--------+---------------+
| codigo | ultimo_cambio |
+--------+---------------+
| asd1   | 2015-01-01    |
| asd2   | NULL          |
| asd3   | NULL          |
+--------+---------------+
3 rows in set (0.00 sec)

Lo mismo puedes hacer en el CASE-WHEN para cuando los cambios sean > 1... e implementas la lógica del punto 2.

Insisto, esta no es en absoluto la mejor forma de hacerlo (de hecho es una de las peores formas de hacerlo), lo que quiero que observes es que hay muchas formas de matar una mosca, pero utilizar una pistola puede resultar demasiado.

Haz el intento y si continuas con problemas lo comentas en el foro.

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

ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

Publicado por emmanuel (5 intervenciones) el 22/06/2015 23:46:49
esta interesante. uso el sql server. estoy incursionando. solo lo tengo en el trabajo por el momento. y ahora estoy en mi casa. obviamente el ejemple es solo un ejemplo. en este caso manejo demasiados datos. por eso lo quiero hacer con una consulta con el sql server manager 2008. paso a comentarte. La informacion que manejo no la puedo publicar pero te digo son desde el 2002 al 2015 1800 codigos con 1 o 2 cambios de honorarios por año. pero ningun codigo cambia el mismo dia. entonces por esto se actualiza la base cada 10 dias o 5 dias. y en cada actualizacion entran los 1800 codigos con sus respectivos honorarios al momento. si sufrieron cambios o no, igual se los computa. son archivos dbf bastante grandes.

lo que yo quiero es crear otra tabla a partir de la original. con solo 1 aumento de honorario con su respectiva fecha. o sea la fecha en la que se cargo el aumento, de cada codigo. Para luego hacer :

selec * from Tabla_Nueva
where codigo = 'asd1'

y que esto arroje


+--------+---------------+----------------
| codigo | fecha | honorario
+--------+---------------+----------------
| asd1 | x_fecha | 1000
| asd1 | y_fecha | 1500
| asd1 | z_fecha | 2000
+--------+---------------+--------------


los datos q uso en las fecha son "..datatime.."

creo q se llaman comandos query o algo asi.

muchas gracias por tomarte tu tiempo. me sirvio de mucho el count ( distinct )
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

ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

Publicado por EMMANUEL (5 intervenciones) el 23/06/2015 15:36:18
select p_codigo, COUNT(DISTINCT honorario)as cambios
from lista_180615
group by p_codigo
order by cambios



SELECT T1.p_codigo, CASE T1.cambios
WHEN 1 THEN (SELECT MIN(v_fecha)
FROM lista_180615 as T2
WHERE T1.p_codigo = T2.p_codigo)
END ultimo_cambio
FROM
( SELECT p_codigo, COUNT(DISTINCT honorario) cambios
FROM lista_180615
GROUP BY p_codigo)as T1
order by ultimo_cambio

asi lo traduci a mi sql server management.
tu consulta esta buena, pero no se como usar esa clausula "CASE".
ten en cuenta que soy nuevo y me falta mucha teoría en el campo de la informática.
el campo codigo en realidad en mi tabla se llama P_CODIGO el campo honorario queda igual y la tabla se llama LISTA. con su respectiva fecha de actualizacion. :) me devuelve muchos datos datos null. lo q yo necesito es ver codigo por codigo la evolucion de los incrementos.


ahora paso a contarte.

de la tabla lista. yo corte y cree otras tablas listas_x una por año desde el 2002 al 2015. pero solo tome la ultima fecha de actualizacion de cada año. para tener una evolucion anual. pero el caso es q de vez en cuando, algunos codigos, cambian sufren varios incrementos por año. y pueden ser tanto en enero como en cualquier otro mes. y yo necesito detectar eso. al final de todo en mi consulta veo reflejado algo asi:



SELECT * FROM EVO_HON_X
WHERE P_CODIGO IN ('330101')


codigo |honorario | año
330101 |45 |2014
330101 |45 |2013
330101 |10,11 |2012
330101 |10,11 |2011
330101 |10,11 |2010
330101 |10,11 |2009
330101 |10,11 |2008
330101 |10,11 |2007
330101 |10,11 |2006
330101 |10,11 |2003



evo_honn_x es la tabla q yo cree a partir de la tabla LISTA. cortando cada año y tomando su ultimo precio. y luego uniendo todas y cada una de esas tablas. en EVO_HON_X...
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
sin imagen de perfil
Val: 109
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

Publicado por Rafael (111 intervenciones) el 24/06/2015 10:43:13
Creo lo mas sencillo seria evaluar el registro actual contra el registro previo...
Algo similar a esto:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT FECHA
     , CODIGO
     , INCREMENTO
FROM  (SELECT EVHO.FECHA
            , EVHO.CODIGO
            , EVHO.HONORARIO
            , IF((@ULTIMO_COD = EVHO.CODIGO) AND (@ULTIMO_HON = EVHO.HONORARIO), NULL, EVHO.HONORARIO) AS INCREMENTO
       FROM   EVO_HONORARIOS EVHO
            , (SELECT @ULTIMO_COD := EVHO.CODIGO
                    , @ULTIMO_HON := EVHO.HONORARIO) SQLVARS
       ORDER BY FECHA, CODIGO)
WHERE INCREMENTO IS NOT NULL;

Ya me contaras...
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
sin imagen de perfil
Val: 109
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

Publicado por Rafael (111 intervenciones) el 24/06/2015 10:59:53
Pues me he quedado con la duda de si lo que te puse antes funcionaba o no...

He hecho una prueba y lo correcto seria esto ... disculpas...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT FECHA
     , CODIGO
     , INCREMENTO
FROM  (SELECT EVHO.FECHA
            , EVHO.CODIGO
            , EVHO.HONORARIO
            , IF(    (@ULTIMO_COD = EVHO.CODIGO)
                 AND (@ULTIMO_HON = EVHO.HONORARIO)
                 , NULL, EVHO.HONORARIO) AS INCREMENTO
            , @ULTIMO_COD := EVHO.CODIGO
            , @ULTIMO_HON := EVHO.HONORARIO
       FROM   EVO_HONORARIOS AS EVHO
            , (SELECT @ULTIMO_COD:=0
                    , @ULTIMO_HON:=0) AS SQLVARS
       ORDER BY EVHO.CODIGO, EVHO.FECHA) TEMP
WHERE INCREMENTO IS NOT NULL;

Mira:
Query

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

ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

Publicado por Rafael (111 intervenciones) el 24/06/2015 13:55:06
Despues de poner lo anterior que leo que el tema va de SQL Server...

Asi que nada a postear de nuevo ya que en SQL Server se puede hacer un poco mas facil mira...

1
2
3
4
5
6
7
8
9
10
11
12
select fecha
     , codigo
     , honorarios
from (select fecha
           , codigo
           , honorarios
           , lag(honorarios) OVER (PARTITION BY codigo
                                   ORDER BY fecha) as ant_honorarios
      from   evo_honorarios
      ) as QA
where ant_honorarios is null
or    honorarios != ant_honorarios
aqui la imagen
Query

Saludos
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

ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

Publicado por EMMANUEL (5 intervenciones) el 24/06/2015 14:38:28
escribime al correo. asi te mando una pedaso del dbf. y como quiero q se vea. si?? asi no reneguemos con tganto prueba y error. por q al final los campos no van a ser los mismos nunca por el hecho de estar limitados a darte ejemplos y no los verdaderos datos, :) si te sirve y estas dispuesto a ayudarme, :).. [email protected]
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

ACTUALIZACIONES DE PRECIOS POR FECHAS SQL

Publicado por emmanuel (5 intervenciones) el 06/07/2015 21:29:55
holaa. regreso con una nueva duda... :D te voy a sacar canas verdes :P jajaja



tengo esta tabla. obviamente reducida. hay mas codigos

CODIGO | HONORARIO | FECHA
010101 | 519,69 | 2002-02-01
010101 | 519,69 | 2003-04-01
010101 | 866,14 | 2006-02-01
010101 | 866,14 | 2007-03-01
010101 | 1126,06 | 2008-06-01
010101 | 1126,06 | 2009-01-01
010101 | 1126,06 | 2010-02-08
010101 | 2159,78 | 2011-12-12
010101 | 2159,78 | 2012-01-05
010101 | 2703,44 | 2013-01-01
010101 | 3574,8 | 2014-04-09




QUIERO BORRAR LOS REGISTROS REPETIDOS. Y SOLO DEJAR EL PRIMERO. EJEMPLO




CODIGO | HONORARIO | FECHA
010101 | 519,69 | 2002-02-01
010101 | 866,14 | 2006-02-01
010101 | 1126,06 | 2008-06-01
010101 | 2159,78 | 2011-12-12
010101 | 2703,44 | 2013-01-01
010101 | 3574,8 | 2014-04-09



SIEMPRE USANDO SQL SERVER MANAGEMENT 2008

GRACIAS PÒR SIEMPRE ESTAR EN TODAS! :D
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