SQL - corregir SQL

 
Vista:
sin imagen de perfil

corregir SQL

Publicado por jhean carlos (13 intervenciones) el 12/12/2013 23:01:58
como estan

no me corre esta consulta tengo 2 tablas del que una tiene datos unicos que no se repiten

tabla SELECT_1
id.......opcion
1........cochabamaba
2........beni
3........tarija

en la otra tabla tengo que se repiten o se guardan datos para que no se pierdan se ven en el (id) de las dos tablas

tabla GERENTE_REGIONAL
cod_gerente......id.......gestion
10........................1........2013
11........................2........2013
13........................2........2013
15........................3........2013

lo que quiero sacar es una relacion de las dos tablas en la que solo tenga una información que no se repita y solo tomar de la segunda tabla el ultimo registrado

aca mi codigo no me resulta que error tengo?

SELECT T1.id,T1.opcion,T2.nombre
FROM select_1 T1
INNER JOIN gerente_regional T2 ON T1.id=T2.id
INNER JOIN
(SELECT MAX (cod_gerente) cod_gerente
FROM
gerente_regional
GROUP BY id) TM ON T2.cod_gerente = TM.cod_gerente;
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
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

corregir SQL

Publicado por Isaias (1919 intervenciones) el 13/12/2013 19:19:26
En tu ejemplo, no veo donde esta la REPETCION de registros...
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

corregir SQL

Publicado por jhean carlos (13 intervenciones) el 13/12/2013 19:52:51
tabla SELECT_1
id.......opcion
1........cochabamaba
2........beni
3........tarija


tabla GERENTE_REGIONAL
cod_gerente......id.......gestion..monto
10........................1........2013......200
11........................2........2013......150
13........................2........2013......350
15........................3........2013......600

perdon quiero que salga asi la respuesta

id.......opcion................gestion......monto
1........cochabamaba..2013..........200
2........beni....................2013...........350
3........tarija...................2013...........600

pero mi SQL me sale error pero no se que?

SELECT T1.id,T1.opcion,T2.gestion,T2.monto
FROM select_1 T1
INNER JOIN gerente_regional T2 ON T1.id=T2.id
INNER JOIN
(SELECT MAX (cod_gerente) cod_gerente
FROM
gerente_regional
GROUP BY id) TM ON T2.cod_gerente = TM.cod_gerente;
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: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

corregir SQL

Publicado por leonardo_josue (1173 intervenciones) el 13/12/2013 21:48:57
Hola jhean carlos:

A simple vista, la consulta no tiene ningún error, ¿qué error te marca el motor de BD? lo único que veo al copiar tu código es que tienes un espacio entre MAX y el paréntesis... pero en realidad la consulta funciona según lo que deseas, (al menos en MySQL)... no nos dices con qué BD estás trabajando, el error puede ser entonces por el motor en sí:

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
mysql> SELECT * FROM SELECT_1;
+------+-------------+
| id   | opcion      |
+------+-------------+
|    1 | cochabamaba |
|    2 | beni        |
|    3 | tarija      |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM GERENTE_REGIONAL;
+-------------+------+---------+-------+
| cod_gerente | id   | gestion | monto |
+-------------+------+---------+-------+
|          10 |    1 |    2013 |   200 |
|          11 |    2 |    2013 |   150 |
|          13 |    2 |    2013 |   350 |
|          15 |    3 |    2013 |   600 |
+-------------+------+---------+-------+
4 rows in set (0.00 sec)
 
mysql> SELECT T1.id,T1.opcion,T2.gestion,T2.monto
    -> FROM select_1 T1
    -> INNER JOIN gerente_regional T2 ON T1.id=T2.id
    -> INNER JOIN
    -> (  SELECT MAX(cod_gerente) cod_gerente
    ->    FROM
    ->       gerente_regional
    ->    GROUP BY id
    -> ) TM ON T2.cod_gerente = TM.cod_gerente;
+------+-------------+---------+-------+
| id   | opcion      | gestion | monto |
+------+-------------+---------+-------+
|    1 | cochabamaba |    2013 |   200 |
|    2 | beni        |    2013 |   350 |
|    3 | tarija      |    2013 |   600 |
+------+-------------+---------+-------+
3 rows in set (0.00 sec)

Lo único que tengo es una observación con respecto a la subconsulta... esto igual y puede ser que no te afecte, todo depende de cómo tienes tu información, pero en lo general este tipo de consultas lo tienes que hacer ligando no solo el MAX(campo), sino también el campo por el que estás agrupando... es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT id, MAX(cod_gerente) cod_gerente
    -> FROM
    ->    gerente_regional
    -> GROUP BY id;
+------+-------------+
| id   | cod_gerente |
+------+-------------+
|    1 |          10 |
|    2 |          13 |
|    3 |          15 |
+------+-------------+
3 rows in set (0.00 sec)

y en la cláusula ON del INNER JOIN, también consideras este campo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT T1.id,T1.opcion,T2.gestion,T2.monto
    -> FROM select_1 T1
    -> INNER JOIN gerente_regional T2 ON T1.id=T2.id
    -> INNER JOIN
    -> (  SELECT id, MAX(cod_gerente) cod_gerente
    ->    FROM
    ->       gerente_regional
    ->    GROUP BY id
    -> ) TM ON T2.cod_gerente = TM.cod_gerente AND T2.id = TM.id;
+------+-------------+---------+-------+
| id   | opcion      | gestion | monto |
+------+-------------+---------+-------+
|    1 | cochabamaba |    2013 |   200 |
|    2 | beni        |    2013 |   350 |
|    3 | tarija      |    2013 |   600 |
+------+-------------+---------+-------+
3 rows in set (0.00 sec)

Esto debes hacerlo si por ejemplo tu campo id_cod_gerente puede repetirse para distintos ID's... pero te repito, en realidad esto no es necesario si tu campo es una secuencia o un consecutivo.

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

corregir SQL

Publicado por jhean carlos (13 intervenciones) el 13/12/2013 22:08:55
LA VERDAD NO SE QUE PASO ESTOY CON MYSQL Y NAVICAT PERO YA FUNCIONA BIEN PERO QUE RRARO QUE NO FUNCIONO PARA NADA ANTES

PERO TODO OK GRACIAS!!
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

corregir SQL

Publicado por fernando (1 intervención) el 18/11/2022 21:47:38
me podrían apoyar en corregir este Queryx ya que al momento de ejecutarlo me está duplicando o triplicando la información que requiero del concepto 1495 y 1508 que están como
ac1.concepto = 1495 y
ac2.conceptpo = 1508

les comparto el script y anexo imagen donde están los conceptos que requiero recupere un importe que está en los acumulados del mes a consultar

************************
SELECT DISTINCT
tg.compania,
cia.nombre_cia AS nombre_cia,
tg.trabajador,
REPLACE(tb.nombre, '/',' ') nombre,
tg.fecha_ingreso,
rta1.dato AS costcenter,
dta1.descripcion AS busnessgroup,
rta2.dato AS jg,

ISNULL(SUM(ac1.importe),0) AS acumulated_accrual,
ISNULL(SUM(ac2.importe * 30),0) AS average_Salaries,

ISNULL((SELECT SUM(vac_por_ciclo) - (SUM(vac_disfrutadas) + SUM(vac_programadas) + SUM(vac_vencidas) ) FROM saldos_vacaciones sv WHERE tg.compania = sv.compania AND tg.trabajador = sv.trabajador AND sv.situacion_ciclo = 1),0) AS vacation_balance_days,

ISNULL(SUM(ac2.importe ) * (SELECT SUM(vac_por_ciclo) - (SUM(vac_disfrutadas) + SUM(vac_programadas) + SUM(vac_vencidas) ) FROM saldos_vacaciones sv WHERE tg.compania = sv.compania AND tg.trabajador = sv.trabajador AND sv.situacion_ciclo = 1),0) AS cost_vacation_balance,

ISNULL(SUM(ac2.importe) / 1 * (SELECT SUM(vac_por_ciclo) - (SUM(vac_disfrutadas) + SUM(vac_programadas) + SUM(vac_vencidas) ) FROM saldos_vacaciones sv WHERE tg.compania = sv.compania AND tg.trabajador = sv.trabajador AND sv.situacion_ciclo = 1),0) - ISNULL(SUM(ac1.importe),0) AS accrual_balance,

ac1.anio,
ac1.mes_acumular,
CASE ac1.mes_acumular
WHEN 1 THEN 'Enero'
WHEN 2 THEN 'Febrero'
WHEN 3 THEN 'Marzo'
WHEN 4 THEN 'Abril'
WHEN 5 THEN 'Mayo'
WHEN 6 THEN 'Junio'
WHEN 7 THEN 'Julio'
WHEN 8 THEN 'Agosto'
WHEN 9 THEN 'Septiembre'
WHEN 10 THEN 'Octubre'
WHEN 11 THEN 'Noviembre'
WHEN 12 THEN 'Diciembre'
END AS mes_descripcion
FROM trabajadores_grales tg LEFT JOIN acum_concepto ac1 ON tg.compania = ac1.compania
AND tg.trabajador = ac1.trabajador
AND ac1.concepto = 1495

LEFT JOIN acum_concepto ac2 ON tg.compania = ac1.compania
AND tg.trabajador = ac1.trabajador
AND ac1.concepto = 1508

INNER JOIN rel_trab_agr rta1 ON tg.compania = rta1.compania AND tg.trabajador = rta1.trabajador AND rta1.agrupacion = 'DEPARTMENT'
INNER JOIN datos_agr_trab dta1 ON rta1.compania = dta1.compania AND rta1.agrupacion = dta1.agrupacion AND rta1.dato = dta1.dato

INNER JOIN rel_trab_agr rta2 ON tg.compania = rta2.compania AND tg.trabajador = rta2.trabajador AND rta2.agrupacion = 'JOBGRADE'
INNER JOIN datos_agr_trab dta2 ON rta2.compania = dta2.compania AND rta2.agrupacion = dta2.agrupacion AND rta2.dato = dta2.dato

INNER JOIN trabajadores tb ON tg.trabajador = tb.trabajador
INNER JOIN companias cia ON tg.compania = cia.compania

WHERE tg.compania = '3119'
AND ac1.anio = 2022
AND ac1.mes_acumular = 11
AND ac1.TRABAJADOR = ' 01207393'


GROUP BY
tg.compania,
cia.nombre_cia,
tg.trabajador,
tb.nombre,
tg.fecha_ingreso,
rta1.dato,
dta1.descripcion,
rta2.dato,
ac1.anio,
ac1.mes_acumular
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