Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   concatenar dos valores de registros distintos según duplicados (https://www.clubdelphi.com/foros/showthread.php?t=80033)

lmpadron 29-08-2012 19:02:59

concatenar dos valores de registros distintos según duplicados
 
Saludos comunidad

Estoy tratando de hacer una consulta MySQL sobre la siguiente tabla

Código SQL [-]
mysql> explain orden_trabajadores_estibadores;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| id_trabajadores | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| expediente      | varchar(11)      | NO   |     | NULL    |                |
| numero          | varchar(7)       | NO   |     | NULL    |                |
| orden           | varchar(7)       | NO   |     | NULL    |                |
| turno           | varchar(5)       | NO   |     | NULL    |                |
| fecha           | varchar(10)      | NO   |     | NULL    |                |
| convenio        | varchar(7)       | NO   |     | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

Al hacer un select sobre esta tabla tengo esta informacion

Código SQL [-]
mysql> select expediente, orden  from  orden_trabajadores_estibadores;
+------------+-------+
| expediente | orden |
+------------+-------+
| 32444      | 2353  |
| 32491      | 2353  |
| 32480      | 2353  |
| 33280      | 2353  |
| 31345      | 993   |
| 32459      | 2353  |
| 32444      | 993   |
| 32077      | 368   |
| 32084      | 368   |
| 32055      | 368   |
| 31136      | 368   |
| 32839      | 3361  |
+------------+-------+
12 rows in set (0.00 sec)

Lo que deseo es ver los expedientes que estan dobles y poder determinar en que ordenes se encuentran, para ello uso la siguiente sentencia

Código SQL [-]
mysql> select expediente, count(expediente) as total_expediente
    -> from orden_trabajadores_estibadores
    -> group by expediente;
+------------+------------------+
| expediente | total_expediente |
+------------+------------------+
| 31136      |                1 |
| 31345      |                1 |
| 32055      |                1 |
| 32077      |                1 |
| 32084      |                1 |
| 32444      |                2 |
| 32459      |                1 |
| 32480      |                1 |
| 32491      |                1 |
| 32839      |                1 |
| 33280      |                1 |
+------------+------------------+
11 rows in set (0.00 sec)

Como podemos ver esta vez ya veo el expediente y al lado la cantidad de veces que esta repetido, sin embargo necesito saber en que ordenes se repitió, para ello se me ocurrió la idea de concatenar y ahi es donde se trabo la cosa :(

Código SQL [-]
mysql> SELECT expediente, count(expediente) as total,
    ->  (SELECT CONCAT_WS('-',orden_trabajadores_estibadores.orden,
    ->                                    orden_trabajadores_estibadores.orden))
    ->    as ubicacion
    -> FROM orden_trabajadores_estibadores;
+------------+-------+-----------+
| expediente | total | ubicacion |
+------------+-------+-----------+
| 32444      |    12 | 2353-2353 |
+------------+-------+-----------+
1 row in set (0.00 sec)

Aqui veo la Orden pero solo la del primer registro repetido y necesito ver la del primero + la del segundo + n registros ademas el total que me muestra es el de los registros que se encuentran en la tabla y no solo los repetidos, agregamos el group y queda asi

Código SQL [-]
mysql> SELECT expediente, count(expediente) as total,
    ->  (SELECT CONCAT_WS('-',orden_trabajadores_estibadores.orden,
    ->                        orden_trabajadores_estibadores.orden))
    ->    as ubicacion
    -> FROM orden_trabajadores_estibadores
    -> group by expediente;
+------------+-------+-----------+
| expediente | total | ubicacion |
+------------+-------+-----------+
| 31136      |     1 | 368-368   |
| 31345      |     1 | 993-993   |
| 32055      |     1 | 368-368   |
| 32077      |     1 | 368-368   |
| 32084      |     1 | 368-368   |
| 32444      |     2 | 2353-2353 |
| 32459      |     1 | 2353-2353 |
| 32480      |     1 | 2353-2353 |
| 32491      |     1 | 2353-2353 |
| 32839      |     1 | 3361-3361 |
| 33280      |     1 | 2353-2353 |
+------------+-------+-----------+
11 rows in set (0.00 sec)

Sigue mostrandome la orden del primer registro repetido, algo obvio porque no he encontrado una forma de decirle que lo haga para cada registro, asi que todo lo que hace es repetir dos veces la instruccion y lo ideal seria que lo hiciera pero diferenciando entre los registros repetidos, no he usado aun el IF THEN ELSE voy a tratar ahora aver si algo sale de ahi (aunque aun no tengo muy claro como voy a hacerlo) asi que si a alguien se le ocurre una idea de como hacerlo me vendría bien la ayuda.
Gracias de antemano por su tiempo :D:D:D:D:D

roman 29-08-2012 19:19:43

Intenta algo así:

Código SQL [-]
select A.expediente, A.orden
from orden_trabajadores_estibadores A
left join (select expediente from orden_trabajadores_estibadores group by expediente having count(expediente) > 1) B on B.expediente = A.expediente
where B.expediente is not null

// Saludos

roman 29-08-2012 19:25:56

En l consulta que te puse, vas a obtener un registro por cada repetición y no uno sólo con los valores concatenados, no creo que esto último sea posible pero no lo aseguro. De todas formas, con la consulta de arriba ves únicamente los registros que se duplican, que de algo ha de servir :)

// Saludos

lmpadron 30-08-2012 17:05:05

Perfecto, muchas gracias roman !!!


La franja horaria es GMT +2. Ahora son las 06:16:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi