SQL - Vista con GROUP BY y Tabla relacionada

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

Vista con GROUP BY y Tabla relacionada

Publicado por gorka_arai (3 intervenciones) el 13/06/2018 16:21:11
PRIMERO: Disculpas por repetir tema pero en el anterior la imagen era incorrecta. Ruego a los administradores que eliminen el otro hilo de igual título.

Buenas masters,
estoy intentando hacer una View pero al relacionarla con otra tabla se me repiten datos... No sé qué estoy haciendo mal... Os cuento: Lo que trato de hacer es una vista que muestre el código de oferta y el nombre del proveedor a quien se le ha hecho esa oferta. Como en mi tabla de ofertas salen repetidas muchas veces, he agrupado. Hasta aquí todo bien... El problema viene cuando tengo que "traer" el nombre del proveedor (que está en la tabla de "Proveedor"). Esto lo hago relacionando el campo "Nº proveedor" (de la tabla Ofertas) con el campo "Nº" de la tabla Proveedor. Pero al mostrar en la vista el campo Nombre... Los datos salen repetidos...

Os pongo una captura del diseño de mi View para que veáis todo esto

Versión: SQL Server 2008 R2


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

Vista con GROUP BY y Tabla relacionada

Publicado por leonardo_josue (1173 intervenciones) el 13/06/2018 17:32:37
Hola gorka_arai:

¿A qué te refieres con que te muestra datos repetidos? esto me suena más bien a que tienes una relación uno a muchos (1 a n) entre tus tablas y eso hace que "parezca" que hay información repetida:

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
mysql> select * from tabla_a;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> select * from tabla_b;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | one         |
|    1 | un          |
|    2 | two         |
|    2 | deux        |
|    3 | three       |
|    3 | trois       |
+------+-------------+
6 rows in set (0.00 sec)
 
mysql> select * from tabla_a inner join tabla_b on tabla_a.id = tabla_b.id;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    1 | uno         |    1 | un          |
|    2 | dos         |    2 | two         |
|    2 | dos         |    2 | deux        |
|    3 | tres        |    3 | three       |
|    3 | tres        |    3 | trois       |
+------+-------------+------+-------------+
6 rows in set (0.01 sec)

en esta última consulta podría pensarse que hay información duplicada para las dos primeras columnas, pero no es así, sino que simplemente se "ven" registros duplicados pero la información es correcta, ya que no hay ningún registro "idéntico".

Primero, postea la consulta que estás ejecutando.

Segundo, postea algunos datos de ejemplo de tus tablas (no tienen que ser reales, simplemente es para darnos cuenta de lo que tienes) a partir de esos datos.

Tercero, a partir de esos datos dinos qué es lo que te está arrojando la consulta (es decir, dónde se muestran los datos duplicados)

Finalmente, a partir de esa salida, dinos qué es lo que está mal y cómo deseas que aparezca tu consulta.

de esta manera será más factible que podamos ayudarte.

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

Vista con GROUP BY y Tabla relacionada

Publicado por gorka_arai (3 intervenciones) el 14/06/2018 17:13:14
Muchas gracias leonardo_josue!!!
Intentaré explicarme mejor atendiendo tus instrucciones...

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
mysql > select * from OFERTAS;
+--------------------+--------------------+-----------------------+-------------------+
| cod_oferta         |   num_linea        |       cod_producto    |    cod_proveedor  |
+--------------------+--------------------+-----------------------+-------------------+
|         1          |       100          |            G01        |           1       |
|         1          |       200          |            G01        |           2       |
|         1          |       300          |            G01        |           3       |
|         2          |       100          |            G01        |           1       |
|         2          |       200          |            G01        |           2       |
|         2          |       300          |            G01        |           3       |
+--------------------+--------------------+-----------------------+-------------------+
 
 
mysql> select * from PROVEEDORES;
+-----------------+----------------------+
|      id         |   nombre_proveedor   |
+-----------------+----------------------+
|       1         |    Dolores Delano    |
|       2         |    Mario Neta        |
|       3         |    Soila Cerda       |
+-----------------+----------------------+
 
 
Lo que pretendo es hacer una vista que me muestre las ofertas que se han realizado (sin que se vean repetidas,
para lo cual habrá que agrupar) con su nombre de proveedor.
Es decir, busco obtener algo así:
 
+--------------------+----------------------+
|     cod_oferta     |   nombre_proveedor   |
+--------------------+----------------------+
|         1          |    Dolores Delano    |
|         2          |    Mario Neta        |
+--------------------+----------------------+
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

Vista con GROUP BY y Tabla relacionada

Publicado por leonardo_josue (1173 intervenciones) el 14/06/2018 22:19:16
Hola de nuevo gorka_arai:

nos dices esto en tu post:

1
2
Lo que pretendo es hacer una vista que me muestre las ofertas que se han realizado (sin que se vean repetidas,
para lo cual habrá que agrupar) con su nombre de proveedor.

Sin embargo, no entiendo cómo es que llegas al resultado de salida con los datos que tienes de ejemplo:

Por un lado, en la salida que muestras pones la columna COD_OFERTA junto con el nombre del proveedor, pero ¿cuál es tu criterio para mostrar ese proveedor en particular? con los datos que pones de ejemplo, la COD_OFERTA = 1 está asociada a los tres proveedores:

1
2
3
4
5
6
7
8
mysql > select * from OFERTAS where cod_oferta = 1;
+--------------------+--------------------+-----------------------+-------------------+
| cod_oferta         |   num_linea        |       cod_producto    |    cod_proveedor  |
+--------------------+--------------------+-----------------------+-------------------+
|         1          |       100          |            G01        |           1       |
|         1          |       200          |            G01        |           2       |
|         1          |       300          |            G01        |           3       |
+--------------------+--------------------+-----------------------+-------------------+

entonces ¿qué criterio es el que utilizas para mostrar Dolores Delano (y no es albur)?

lo mismo pasa con la COD_OFERTA = 2, con los datos de ejemplo, esta oferta la tienen los tres proveedores:

1
2
3
4
5
6
7
8
mysql > select * from OFERTAS where cod_oferta = 2;
+--------------------+--------------------+-----------------------+-------------------+
| cod_oferta         |   num_linea        |       cod_producto    |    cod_proveedor  |
+--------------------+--------------------+-----------------------+-------------------+
|         2          |       100          |            G01        |           1       |
|         2          |       200          |            G01        |           2       |
|         2          |       300          |            G01        |           3       |
+--------------------+--------------------+-----------------------+-------------------+

pero en tu salida estás colocando Mario Neta, entonces, ¿cuál es el criterio aquí para elegir a Mario Neta y no a Dolores Delano?

voy a tratar de jugar al adivino para ver si entendí bien: si lo que quieres es CONTAR cuántas ofertas a publicado cada proveedor, lo que haces es un COUNT 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
30
31
32
33
34
35
mysql> SELECT * FROM ofertas;
+------------+-----------+--------------+---------------+
| cod_oferta | num_linea | cod_producto | cod_proveedor |
+------------+-----------+--------------+---------------+
|          1 |       100 | G01          |             1 |
|          2 |       100 | G01          |             1 |
|          2 |       200 | G01          |             2 |
|          3 |       100 | G01          |             1 |
|          3 |       100 | G01          |             2 |
|          3 |       100 | G01          |             3 |
+------------+-----------+--------------+---------------+
6 rows in set (0.00 sec)
 
mysql> SELECT * FROM proveedores;
+------+------------------+
| id   | nombre_proveedor |
+------+------------------+
|    1 | Proveedor uno    |
|    2 | Proovedor dos    |
|    3 | Proveedor tres   |
+------+------------------+
3 rows in set (0.00 sec)
 
mysql> SELECT nombre_proveedor, COUNT(1) total_ofertas
    -> FROM ofertas
    -> INNER JOIN proveedores ON proveedores.id = ofertas.cod_proveedor
    -> GROUP BY nombre_proveedor;
+------------------+---------------+
| nombre_proveedor | total_ofertas |
+------------------+---------------+
| Proveedor uno    |             3 |
| Proovedor dos    |             2 |
| Proveedor tres   |             1 |
+------------------+---------------+
3 rows in set (0.00 sec)

Si esto no es lo que quieres, entonces VERIFICA BIEN TUS DATOS y a partir de esos datos aclara qué es lo que quieres obtener.

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