SQL - Subconsulta con datos de la misma tabla en sql server

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 4 puestos en SQL (en relación al último mes)
Gráfica de SQL

Subconsulta con datos de la misma tabla en sql server

Publicado por Dary (3 intervenciones) el 26/07/2018 16:41:00
Deseo hacer una subconsulta con datos de la misma tabla que tiene la consulta relacionando tres campos, me explico , la consulta es
1
2
3
4
5
SELECT m.COMPROBANT, COUNT (m.COMPROBANT)Item_ENTRADA, m.FECHA_TRS,m.COD_PROVEE,m.COD_AREA,
SUM(m.ENTRADAS) Total_ENTRADA
  FROM MOVIM AS m
WHERE m.COMPROBANT  LIKE '1%'
GROUP BY m.COMPROBANT,m.FECHA_TRS,m.COD_PROVEE,m.COD_AREA

Y para los datos de la subconsulta los campos

1
2
3
4
SELECT m.COMPROBANT, COUNT (m.COMPROBANT)Item_SALIDAS, m.FECHA_TRS,m.COD_PROVEE,m.COD_AREA,
SUM(m.ENTRADAS) Total_SALIDAS FROM MOVIM AS m
WHERE m.COMPROBANT  LIKE '2%'
GROUP BY m.COMPROBANT,m.FECHA_TRS,m.COD_PROVEE,m.COD_AREA

Es decir que en la tabla MOVIM hay un campo que se llama COMPROBANT pero este compos hay datos que empiecen con '1' y datos que empiecen con '2' entonce lo que deseo que una columna todos lo que empiecen con '1' y otra columna que empiece con '2' por eso razón pongo LIKE pero solo me sale en una columna todo tanto lo que empiezan con '1' como los que empiezan con '2' espero haberme explicado

y de como resultado como se muestra en la imagen de abajo

Sin-titulo

muchas gracias espero su pronta respuesta
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: 182
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Subconsulta con datos de la misma tabla en sql server

Publicado por leonardo_josue (1172 intervenciones) el 26/07/2018 22:00:40
Hola Dary:

Antes de tratar de ayudarte, hay algunas dudas que nos tendrías que aclarar primeramente:

1. ¿Cuál es la estructura de tu tabla MOV y qué datos hay en la tabla antes de las subconsultas? es decir, no pones datos acerca de algunos campos como son m.FECHA_TRS, m.COD_PROVEE, m.COD_AREA. Conviene que pongas tu información "original" y a partir de esos datos nos digas qué es lo que esperas como salida, ya que es posible que el uso de subconsultas no sea la mejor forma para obtener el resultado esperado.
2. ¿Cómo relacionas un Comprobante que empieza con 1 con su respectiva "pareja" que comienza con 2? es decir, en SQL para unir dos tablas a nivel de REGISTRO es necesario que estén relacionados para poder hacer un JOIN, de lo contrario, si tratas de unir dos consultas sin relación se generará un producto cartesiano. O tal vez no existe relación entre sus tablas y simplemente quieres mostrar dos listas "independientes" en distintas columnas.
3. ¿El número de comprobantes que comienzan con 1 es el mismo número de comprobantes que empiezan con 2 o pueden variar?. Si es que varían en número, entonces ¿cómo debes de presentar la información en tu tabla final?

Dependiendo de lo que respondas en estas tres preguntas dependerá la forma en que puedas hacer la consulta. Te voy a poner un ejemplo de lo que podrías hacer, para ver si te puede servir.

supongamos que tienes esta tabla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT comprobante, item FROM tabla;
+-------------+------+
| comprobante | item |
+-------------+------+
| 10114001    |    2 |
| 10114002    |    4 |
| 10114002    |    2 |
| 10114004    |   16 |
| 20516023    |    1 |
| 20717018    |    2 |
| 20417021    |    6 |
| 20115020    |    1 |
+-------------+------+
8 rows in set (0.02 sec)

Entonces, se observa que hay 4 registros que comienzan con 1 y 4 que comienzan con 2... sin embargo, no hay ninguna "relación" entre ellos... Lo que debes hacer entonces es NUMERAR los registros para que tengan un INDICE... (podrías utilizar la función ROW_NUMBER por ejemplo para hacerlo... de tal suerte que tengas dos consultas así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> SELECT id, comprobante, item FROM tabla WHERE comprobante like '1%';
+------+-------------+------+
| id   | comprobante | item |
+------+-------------+------+
|    1 | 10114001    |    2 |
|    2 | 10114002    |    4 |
|    3 | 10114002    |    2 |
|    4 | 10114004    |   16 |
+------+-------------+------+
4 rows in set (0.00 sec)
 
mysql> SELECT id, comprobante, item FROM tabla WHERE comprobante like '2%';
+------+-------------+------+
| id   | comprobante | item |
+------+-------------+------+
|    1 | 20516023    |    1 |
|    2 | 20717018    |    2 |
|    3 | 20417021    |    6 |
|    4 | 20115020    |    1 |
+------+-------------+------+
4 rows in set (0.00 sec)


Entonces, lo que haces es implemente un INNER JOIN utilizando ambas subconsultas para unirlas por el campo ID (que simplemente es un secuencial)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT T1.comprobante, T1.item, T2.comprobante, T2.item
    -> FROM
    ->   ( SELECT id, comprobante, item
    ->     FROM tabla
    ->     WHERE comprobante like '1%') T1
    -> INNER JOIN
    ->   ( SELECT id, comprobante, item
    ->     FROM tabla
    ->     WHERE comprobante like '2%') T2 on T1.id = T2.id;
+-------------+------+-------------+------+
| comprobante | item | comprobante | item |
+-------------+------+-------------+------+
| 10114001    |    2 | 20516023    |    1 |
| 10114002    |    4 | 20717018    |    2 |
| 10114002    |    2 | 20417021    |    6 |
| 10114004    |   16 | 20115020    |    1 |
+-------------+------+-------------+------+
4 rows in set (0.02 sec)


Dale un vistazo para ver si te puede servir.

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

Subconsulta con datos de la misma tabla en sql server

Publicado por Dary (3 intervenciones) el 26/07/2018 23:25:16
bro me sale bien pero tengo un problema como hay mas datos que comiencen con 1 que comiencen con 2 en la tabla MOVIM los datos que comienzan con dos se me repiten varias veces

Capturaq
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: 182
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Subconsulta con datos de la misma tabla en sql server

Publicado por Leonardo Josué (1172 intervenciones) el 26/07/2018 23:49:22
hola de nuevo Dary:

¿y cómo hiciste la consulta si se puede saber?... digo, pasa saber que está mal, primero debemos saber que hiciste ya que lamentablemente no hay muchos adivinos en el foro ¬¬

Tal como estás mostrando los resultados de salida, entonces NO ESTÁS PONIENDO UNA CONDICIÓN EN EL LA CLÁUSULA ON DEL INNER JOIN. En mi post decía esto:

[code...en SQL para unir dos tablas a nivel de REGISTRO es necesario que estén relacionados para
poder hacer un JOIN, de lo contrario, si tratas de unir dos consultas sin relación se generará un
producto cartesiano. [/code]

Esto que pones en semejante a un producto cartesiano, lo que me hace suponer que no tienes bien armada la condición de la cláusula ON.

Postea la consulta que trataste de ejecutar y el resultado independiente de cada subconsulta, para ver que está mal.

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

Subconsulta con datos de la misma tabla en sql server

Publicado por Dary (3 intervenciones) el 27/07/2018 00:02:18
gracias por su tiempo

a continuación le comparto el codigo donde COD_MOVIM es mi ID

1
2
3
4
5
6
7
8
9
10
11
12
SELECT T1.COMPROBANT, T1.Item_SALIDA, T2.COMPROBANT, T2.Item_ENTRADA
     FROM
       ( SELECT COUNT(m.COMPROBANT) Item_SALIDA, m.COMPROBANT,m.COD_MOVIM
         FROM MOVIM AS m
        WHERE m.COMPROBANT like '1%'
        GROUP BY m.COMPROBANT,m.COD_MOVIM)T1
   INNER JOIN
    ( SELECT COUNT(m1.COMPROBANT) Item_ENTRADA, m1.COMPROBANT,m1.COD_MOVIM
        FROM  MOVIM AS m1
       WHERE m1.COMPROBANT like '2%'
    GROUP BY m1.COMPROBANT,m1.COD_MOVIM
    ) T2 on T1.COD_MOVIM = T2.COD_MOVIM

Y como su resultado me da el de la imagen

Capturaq
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: 182
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Subconsulta con datos de la misma tabla en sql server

Publicado por Leonardo Josué (1172 intervenciones) el 27/07/2018 15:39:19
Hola de nuevo Dary:

Lamentablemente sigues sin mostrar lo que te pido O_o

en su post dices que COD_MOVIM es mi ID... ¿Y en donde se muestran qué valores tiene COD_MOVIM.

También te pedía que postearas el resultado independiente de cada subconsulta... esa es la raíz de tu problema.

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

Subconsulta con datos de la misma tabla en sql server

Publicado por Jorge (17 intervenciones) el 28/07/2018 02:52:32
Saludos
Una vez hice algo así pero con el caso de facturas y boletas
en el lado izquierdo facturas, en el lado derecho boletas
para mostrar en el reporte... y para ahorrar papel a la hora de imprimir :p

* Esto funciona en SQL Server, no se si en MySQL sea así o en otros gestores de BD, sería cosa de probar, pero la idea es esta

- Las columnas se unirían con un Full outer join, pero para eso debe haber un ID con lo que se pueda emparejar las columnas y para eso utilizaremos la función ROW_NUMBER()

- Tengo la siguiente tabla sin ningún tipo de relación (comprobate: string, item: int)

Tabla: T1
1
2
3
4
5
6
7
8
9
10
Comprobante	item
20516023	1
20717018	2
20417021	3
20217059	2
10114001	2
10114002	4
10114003	2
10114004	16
10114005	6

- La relación que se creará para este caso será una enumeración de los comprobantes agrupados por el primer dígito left(comprobante,1) (que será 1 o 2)

- Lo ordenamos por comprobante porque en este caso nos interesa que los comprobantes estén ordenados de menor a mayor

- Esa futura relación estará como una nueva columna en la consulta

1
2
3
4
select
ROW_NUMBER()OVER(PARTITION BY left(comprobante,1) Order by comprobante) AS ORD_ID,
Comprobante, item
from T1

Dando como resultado:

1
2
3
4
5
6
7
8
9
10
ORD_ID	Comprobante	item
1	10114001	2
2	10114002	4
3	10114003	2
4	10114004	16
5	10114005	6
1	20217059	2
2	20417021	3
3	20516023	1
4	20717018	2

- Como vemos los comprobantes están ordenados y a la vez enumerados del 1 al 5 para los que empiezan con 1 y del 1 al 4 para los que empiezan con 2

- Ahora solo falta dividir esa consulta en dos, una donde solo muestre los comprobantes que empiecen con 1 y otra donde empiecen con 2

- Y después teniendo esas consultas solo hay que unirlas con Full Outer Join

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT C1.*, C2.*
FROM
   (select
    ROW_NUMBER()OVER(PARTITION BY left(comprobante,1) Order by comprobante) AS ORD_ID1,
    Comprobante AS ComproC1, item AS ItemC1
    from T1
    where Comprobante like '1%'
   ) C1
FULL OUTER JOIN
   (select
    ROW_NUMBER()OVER(PARTITION BY left(comprobante,1) Order by comprobante) AS ORD_ID2,
    Comprobante AS ComproC2, item AS ItemC2, 'otros' AS OtroC2
    from T1
    where Comprobante like '2%'
   ) C2
ON C1.ORD_ID1 = C2.ORD_ID2

Dando como resultado:

Si fuera Select C1.*, C2.* saldría así

1
2
3
4
5
6
ORD_ID1	ComproC1	ItemC1	ORD_ID2	ComproC2	ItemC2	OtroC2
1	10114001	2	1	20217059	2	otros
2	10114002	4	2	20417021	3	otros
3	10114003	2	3	20516023	1	otros
4	10114004	16	4	20717018	2	otros
5	10114005	6	NULL	NULL		NULL	NULL

Si fuera Select C2.*, C1.* saldría así

1
2
3
4
5
6
ORD_ID2	ComproC2	ItemC2	OtroC2	ORD_ID1	ComproC1	ItemC1
1	20217059	2	otros	1	10114001	2
2	20417021	3	otros	2	10114002	4
3	20516023	1	otros	3	10114003	2
4	20717018	2	otros	4	10114004	16
NULL	NULL		NULL	NULL	5	10114005	6

ya luego es cosa que añadas las columnas que quieras a cada consulta y muestres solo las que quieras.

* Como ves en el código final, NO es necesario que las consultas (C1 y C2) sean idénticas o que tengan la misma cantidad de columnas o que tengan los mismos nombres para cada columna, lo único necesario es que tengan con que emparejarse en este caso sería la columna enumerada que creamos ORD_ID1 = ORD_ID2

Salud!
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

Subconsulta con datos de la misma tabla en sql server

Publicado por Lalo Otiniano (1 intervención) el 01/12/2018 20:43:39
Gracias leonardo_josue, me sirvió tu respuesta, mi tabla ya tenía un id, sólo había que adaptarlo a mi caso particular, no dominaba muy bien la sintaxis correcta del inner join, tampoco estaba muy seguro para qué servía, gracias a tí ahora lo entiendo
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