SQL - problema con fecha

   
Vista:

problema con fecha

Publicado por monisysy (1 intervención) el 01/07/2013 23:15:02
hola buenos dias, es que tengo un problema con un sql y no he podido logarlo:
tengo dos tablas

la primera sin_de
cod_i ==fec_si == can_si ==cod_ccaja
D000 2013-06_30 6 2
D001 2013-06_30 4 2
D000 2013-06_29 3 2

la segunda cajadi
cod_i ==fec_caj == can_cajs ==cod_ccaj
D000 2013-06_30 3 2
D001 2013-06_30 4 2
D000 2013-06_29 2 2

y el resultado que busco es el siguiente, que con el mismo cod_ccaj y con la max fecha me sume las cantidades conlos msmo codigos

2013-06-30 D000 9
2013-06-30 D001 8

el sql que hice es

select max(fec1),max(fec2), can1, can2, cod1, cod2, sum(tot)
from (SELECT
s.can_si as can1,
c.can_caj as can2,
s.cod_i as cod1,
c.cod_i as cod2,
max(c.fec_caj) as fec1,
max(s.fec_si) as fec2,
(s.can_si + c.can_caj) as tot
FROM
sin_de s,
cajadi c
WHERE
s.cod_ccaja = c.cod_ccaj AND
s.cod_i = c.cod_i AND
c.cod_ccaj = 2 AND
s.cod_ccaja = 2
group by
can1, can2, cod1, cod2, tot) as too

group by
can1, can2, cod1, cod2, tot
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

problema con fecha

Publicado por leonardo_josue (877 intervenciones) el 02/07/2013 17:40:04
Hola monisysy:

No me queda muy claro que es lo que necesitas hacer, por lo que creo conveniente hacer algunos comentarios para que nos aclares cómo tienes tu información y qué es exactamente lo que necesitas:

1. Por un lado hablas de fechas máximas... pero tienes tu información en dos tablas distintas, por lo tanto, ¿de estás refiriendo a la fecha máxima de cada tabla o a una fecha máxima en general?.

2. Cada cod_1 tiene una fecha asignada, pero eso no implica que tengan la misma fecha máxima (para los datos de ejemplo si corresponde, pues la fecha máxima para ambos sería 2013-06_30, ¿esto siempre es así o cada cod_id puede tener una fecha máxima distinta?

3. El que tengas dos tablas con exactamente la misma estructura y donde aparentemente almacenas información relacionada es un TERRIBLE ERROR DE DISEÑO DE BD... si aun puedes cambiar tu modelo, lo que debes hacer es simplemente tener una tabla y si te interesa distinguir entre un tipo de registros y otro, entonces agregas un atributo extra, así (el ejemplo lo pongo con MySQL, no mencionas que motor estás utilizando:

1
2
3
4
5
6
7
CREATE TABLE `tabla` (
  `cod_i` VARCHAR(5) COLLATE utf8_spanish_ci DEFAULT NULL,
  `fecha` DATE DEFAULT NULL,
  `cantidad` INT(11) DEFAULT NULL,
  `cod_caja` INT(11) DEFAULT NULL,
  `tipo` VARCHAR(20) COLLATE utf8_spanish_ci DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci


De tal manera que tus datos quedarían así:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tabla;
+-------+------------+--------+-----------+--------+
| cod_i | fec_si     | can_si | cod_ccaja | tipo   |
+-------+------------+--------+-----------+--------+
| D000  | 2013-06-30 |      6 |         2 | sin_de |
| D001  | 2013-06-30 |      4 |         2 | sin_de |
| D000  | 2013-06-29 |      3 |         2 | sin_de |
| D000  | 2013-06-30 |      3 |         2 | cajadi |
| D001  | 2013-06-30 |      4 |         2 | cajadi |
| D000  | 2013-06-29 |      2 |         2 | cajadi |
+-------+------------+--------+-----------+--------+
6 rows in set (0.00 sec)


Ahora, volviendo a tu problema, suponiendo que cada producto pueda tener una fecha máxima y esta fecha máxima sea general (es decir, que pueda aparecer en cualquiera de las dos tablas, podrías hacer algo como esto:

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
mysql> SELECT * FROM sin_de;
+-------+------------+--------+-----------+
| cod_i | fec_si     | can_si | cod_ccaja |
+-------+------------+--------+-----------+
| D000  | 2013-06-30 |      6 |         2 |
| D001  | 2013-06-30 |      4 |         2 |
| D000  | 2013-06-29 |      3 |         2 |
+-------+------------+--------+-----------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM cajadi;
+-------+------------+----------+----------+
| cod_i | fec_caj    | can_cajs | cod_ccaj |
+-------+------------+----------+----------+
| D000  | 2013-06-30 |        3 |        2 |
| D001  | 2013-06-30 |        4 |        2 |
| D000  | 2013-06-29 |        2 |        2 |
+-------+------------+----------+----------+
3 rows in set (0.00 sec)
 
mysql> SELECT T1.cod_i, T1.fecha, SUM(T1.cantidad), T1.cod_caja
    -> FROM
    -> (   SELECT cod_i, fec_si fecha, can_si cantidad, cod_ccaja cod_caja
    ->    FROM sin_de
    ->     UNION ALL
    ->     SELECT cod_i, fec_caj fecha, can_cajs cantidad, cod_ccaj cod_caja
    ->     FROM cajadi
    ->  ) T1
    -> INNER JOIN
    -> (   SELECT cod_i, MAX(fecha) max_fecha FROM
    ->     (   SELECT cod_i, fec_si fecha FROM sin_de
    ->         UNION ALL
    ->         SELECT cod_i, fec_caj fecha FROM cajadi ) T2
    ->     GROUP BY cod_i
    -> ) T3 ON T1.cod_i = T3.cod_i AND t1.fecha = T3.max_fecha
    -> GROUP BY
    -> T1.cod_i, T1.fecha, T1.cod_caja ;
+-------+------------+------------------+----------+
| cod_i | fecha      | SUM(T1.cantidad) | cod_caja |
+-------+------------+------------------+----------+
| D000  | 2013-06-30 |                9 |        2 |
| D001  | 2013-06-30 |                8 |        2 |
+-------+------------+------------------+----------+
2 rows in set (0.00 sec)


Como verás, la consulta no es nada trivial, y todo es por cómo tienes tu modelo de datos... si tuvieras una sola tabla como te propongo, la consulta quedaría simplemente así:

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
mysql> SELECT * FROM tabla;
+-------+------------+----------+----------+--------+
| cod_i | fecha      | cantidad | cod_caja | tipo   |
+-------+------------+----------+----------+--------+
| D000  | 2013-06-30 |        6 |        2 | sin_de |
| D001  | 2013-06-30 |        4 |        2 | sin_de |
| D000  | 2013-06-29 |        3 |        2 | sin_de |
| D000  | 2013-06-30 |        3 |        2 | cajadi |
| D001  | 2013-06-30 |        4 |        2 | cajadi |
| D000  | 2013-06-29 |        2 |        2 | cajadi |
+-------+------------+----------+----------+--------+
6 rows in set (0.00 sec)
 
mysql> SELECT T1.cod_i, T1.fecha, SUM(T1.cantidad), T1.cod_caja
    -> FROM tabla T1
    -> INNER JOIN
    -> (  SELECT cod_i, MAX(fecha) max_fecha
    ->    FROM tabla
    ->    GROUP BY cod_i ) T2
    -> ON T1.cod_i = T2.cod_i AND T1.fecha = T2.max_fecha
    -> GROUP BY
    -> T1.cod_i, T1.fecha, T1.cod_caja;
+-------+------------+------------------+----------+
| cod_i | fecha      | SUM(T1.cantidad) | cod_caja |
+-------+------------+------------------+----------+
| D000  | 2013-06-30 |                9 |        2 |
| D001  | 2013-06-30 |                8 |        2 |
+-------+------------+------------------+----------+
2 rows in set (0.00 sec)


La idea es la misma, el resultado es el mismo, pero la consulta es mucho más sencilla. Tómalo en cuenta para tu desarrollo.

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