MySQL - Problema con inner join

 
Vista:
sin imagen de perfil

Problema con inner join

Publicado por Diego (13 intervenciones) el 01/06/2017 12:59:20
Buenos días.

Tengo un problema al hacer una consulta con inner join.

Tengo las siguientes tablas:

T1

SFDOCU SFTIEO sku SFTALL SFCANT
201 20 1 s 1
202 20 1 l 1
202 20 1 m 3
202 20 2 m 2
202 20 3 m 1
203 21 3 s 1
202 21 3 m 1
202 21 2 m 2
204 22 3 m 2
204 22 2 m 1
204 22 2 l 2
204 22 2 m 2


T2

sku
1
1
2
1
2


La columna SFDOCU y SFTIEO sería el id principal, el dato que queremos sacar.
La columna sku, el tipo de producto
La columna SFCANT la cantidad de productos
La columna SFTALL la queremos ignorar, por lo que queremos obtener la suma de cant agrupados por sku.

Lo que quiero obtener tras la consulta es SFDOCU, SFTIEO ordenados por el número de productos coincidentes en la TABLA2 y mostrar una columna con el número de coincidencias. Tampoco quiero que se muestren los resultados que excedan de números de productos en la tabla2 con respecto a la tabla 1.
Pongo el resultado que quisiera obtener:


SFDOCU SFTIEO sku SUMA TOTAL
201 20 1 1 1
202 20 1 6 5
202 21 2 2 2
204 22 2 5 2


Es decir, el 201 20 no debería mostrarse, ya que hay más unidades en la TABLA2 que en la TABLA1 y el resto que se muestran Ordenados por número de coincidencias

La consulta que he conseguido hasta ahora:

SELECT SFDOCU, SFTIEO, Consulta.sku, SUMA, COUNT( Consulta.sku ) AS TOTAL
FROM (

SELECT SFDOCU, SFTIEO, T1.sku, SUM( SFCANT ) AS SUMA
FROM T1
GROUP BY SFDOCU, SFTIEO, T1.sku
) AS Consulta
INNER JOIN (

SELECT T2.sku, COUNT( T2.sku ) AS Repetidas
FROM T2
GROUP BY T2.sku
)T2 ON T2.sku = Consulta.sku
GROUP BY SFDOCU, SFTIEO
ORDER BY TOTAL

Me da el siguiente resultado, lejos de lo que pretendo:

SFDOCU SFTIEO sku SUMA TOTAL
201 20 1 1 1
202 21 2 2 1
204 22 2 5 1
202 20 1 4 2


Ya que no consigo ni las sumas de todos los sku (solo del que sale en el resultado) ni el total de coincidencias.

Alguna idea de como se podría hacer? O no es factible hacerlo en una sola consulta?
Gracias.

(Adjunto bbdd)
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: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Problema con inner join

Publicado por leonardo_josue (414 intervenciones) el 01/06/2017 23:40:49
Hola Diego:

No me están cuadrando las cuentas con los datos que estás poniendo de ejemplo o_O, igual y no entendí bien y me perdí en la explicación,

Vamos a poner el ejemplo SFDOCU = 202 y sftieo = 20, sku = 1 entonces tenemos estos registros en T1:


1
2
3
4
5
6
7
8
mysql> SELECT * FROM t1 WHERE sfdocu = 202 AND sftieo = 20 and sku = 1;
+--------+--------+-----+--------+--------+
| SFDOCU | SFTIEO | sku | SFTALL | SFCANT |
+--------+--------+-----+--------+--------+
|    202 |     20 |   1 | l      |      1 |
|    202 |     20 |   1 | m      |      3 |
+--------+--------+-----+--------+--------+
2 rows in set (0.00 sec)

según lo que quieres obtener como resultado, para esta combinación es esto:

1
2
SFDOCU	SFTIEO	sku	SUMA	TOTAL
202	20	1	6	5

pero no entiendo de donde sale la suma de 6? y ese total 5?

o una de dos, la tabla resultante tiene mal el cálculo y deberían ser SUMA = 4, total = 2 o de plano nos explicas mejor cómo llegas a ese resultado.

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

Problema con inner join

Publicado por Diego (13 intervenciones) el 02/06/2017 10:37:37
Hola, efectivamente me he debido explicar mal. A ver si lo puedo aclarar.

en ese caso concreto, 202 20 el resultado de TOTAL sería 5 porque coinciden 5 resultados con respecto a la tabla2
coinciden 3 sku 1 y 2 sku 2, 3+2=5. El resultado suma es el que no vale de mucho ahí, ya que yo las sumas las quiero solo (y diferenciadas por sku) para comprobar que no sean menores que el número de sku de la tabla2 ocmo muestra el ejemplo de 201 20 que al tener menos cantidad de sku 1 que la tabla 2, no debería mostrarse.

Se que es difícil de entender, pero a ver si con tu ayuda veo una solución.

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

Problema con inner join

Publicado por Diego (13 intervenciones) el 02/06/2017 11:32:49
He conseguido algo más.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT SFDOCU, SFTIEO, Consulta.sku, SUMA, COUNT( Consulta.sku ) AS TOTAL
FROM (
 
SELECT SFDOCU, SFTIEO, T1.sku, SUM( SFCANT ) AS SUMA
FROM T1
GROUP BY SFDOCU, SFTIEO, T1.sku
) AS Consulta
INNER JOIN (
 
SELECT T2.sku, COUNT( T2.sku ) AS Repetidas
FROM T2
GROUP BY T2.sku
)T2 ON T2.sku = Consulta.sku
AND Repetidas <= suma
GROUP BY SFDOCU, SFTIEO, sku
ORDER BY TOTAL


así me muestra la SUMA real de los diferentes sku, pero sigo sin saber como puedo contar las coincidencias con la T2, es decir, obtener el TOTAL de coincidencias para poder ordenarlos .
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

Problema con inner join

Publicado por Diego (13 intervenciones) el 02/06/2017 11:57:06
Perdón, es la siguiente consulta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT SFDOCU, SFTIEO, Consulta.sku, SUMA, COUNT( Consulta.sku ) AS TOTAL
FROM (
 
SELECT SFDOCU, SFTIEO, T1.sku, SUM( SFCANT ) AS SUMA
FROM T1
GROUP BY SFDOCU, SFTIEO, T1.sku
) AS Consulta
INNER JOIN (
 
SELECT T2.sku, COUNT( T2.sku ) AS Repetidas
FROM T2
GROUP BY T2.sku
)T2 ON T2.sku = Consulta.sku
AND Repetidas <= suma
GROUP BY SFDOCU, SFTIEO, sku
ORDER BY TOTAL
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

Problema con inner join

Publicado por Diego (13 intervenciones) el 02/06/2017 13:07:40
Resulelto!!!

Finalmente di con la solución


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT SFDOCU, SFTIEO, Consulta.sku, SUMA, COUNT( Consulta.sku ) AS TOTAL
FROM (
 
SELECT SFDOCU, SFTIEO, T1.sku, SUM( SFCANT ) AS SUMA
FROM T1
GROUP BY SFDOCU, SFTIEO, T1.sku
) AS Consulta
INNER JOIN (
 
SELECT T2.sku, COUNT( T2.sku ) AS Repetidas
FROM T2
GROUP BY T2.sku
)T2 ON T2.sku = Consulta.sku
AND Repetidas <= suma
GROUP BY SFDOCU, SFTIEO
HAVING total >= (
SELECT COUNT( DISTINCT (
T2.sku
) ) AS Repe
FROM T2 )
ORDER BY TOTAL DESC


Con esto parece que me da los campos que coinciden íntegramente con la t2.

Gracias por tu ayuda, porque si no lo hubiera dejado por imposible.

No se si hay alguna manera de mejorar la sentencia para la rapidez de la base de datos, pero así funciona.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Xavi
Val: 39
Ha aumentado su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Problema con inner join

Publicado por Xavi (14 intervenciones) el 03/06/2017 00:10:48
Gracias por compartirlo!!!
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