SQL - CONSULTA SQL DOS VALORES

 
Vista:

CONSULTA SQL DOS VALORES

Publicado por ANTONIO (39 intervenciones) el 04/04/2018 19:55:43
Saludos amigos estoy perdido y no se como hacerlo a ver si me echais un cable:
Imaginad tabla con tres campos: nombre, dia, servicio

nombre dia servicio

antonio dia1 m
antonio dia2 m
pepe dia1 m
pepe dia2 x
juan dia1 m
juan dia2 m


Yo quiero una consulta que me duelva solo los campos cuyo valor del campo dia igual a dia1 y dia2 tengan el servicio m
Es decir si el dia1 tiene servicio m pero el dia2 no lo tiene o viceversa, no tiene que aparecer.
Es decir la consulta tendría que devolverme:
antonio dia1 m
antonio dia2 m
juan dia1 m
juan dia2 m

y obviamente pepe que eldia 2 tiene el servicio x no tiene que aparcerme.
Pues ufff no me sale no se hacerlo y llevo rato.
Por favor decirme algo gracias.
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

CONSULTA SQL DOS VALORES

Publicado por Isaias (1921 intervenciones) el 04/04/2018 21:30:13
¿En que MOTOR de base de datos?
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

CONSULTA SQL DOS VALORES

Publicado por leonardo_josue (1173 intervenciones) el 04/04/2018 22:08:47
Hola Antonio:

Hay muchas formas de resolver este ejercicio, la más simple desde mi punto de vista es hacer uso de funciones de agrupación, veamos un ejemplo. supongamos que tienes esta información en tu tabla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT * FROM tabla;
+---------+------+----------+
| nombre  | dia  | servicio |
+---------+------+----------+
| antonio | dia1 | m        |
| antonio | dia2 | m        |
| pepe    | dia1 | m        |
| pepe    | dia2 | x        |
| juan    | dia1 | m        |
| juan    | dia2 | m        |
| leo     | dia1 | m        |
| leo     | dia1 | m        |
| hugo    | dia1 | n        |
| hugo    | dia2 | n        |
+---------+------+----------+
10 rows in set (0.00 sec)

es Básicamente la misma información que pusiste de ejemplo, pero agrego dos casos, primero el caso de LEO, que tiene DOS REGISTROS, pero que ambos son para el día1 y el servicio M, por lo tanto faltaría el dia2 y el caso de HUGO que no tienen ningún registro de los que te interesan... en primer lugar, lo que hacemos es filtrar aquellos registros que NO CUMPLEN CON TU CONDICIÓN, es decir, podrías hacer algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT *
    -> FROM
    ->   tabla
    -> WHERE dia IN ('dia1', 'dia2') and servicio = 'm';
+---------+------+----------+
| nombre  | dia  | servicio |
+---------+------+----------+
| antonio | dia1 | m        |
| antonio | dia2 | m        |
| pepe    | dia1 | m        |
| juan    | dia1 | m        |
| juan    | dia2 | m        |
| leo     | dia1 | m        |
| leo     | dia1 | m        |
+---------+------+----------+
7 rows in set (0.00 sec)

Ahora, lo que tienes que hacer es CONTAR para cada nombre CUANTOS REGISTROS DISTINTOS TIENEN EN ESTA CONSULTA, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT nombre, COUNT(DISTINCT dia) total
    -> FROM
    ->   tabla
    -> WHERE dia IN ('dia1', 'dia2') and servicio = 'm'
    -> GROUP BY nombre;
+---------+-------+
| nombre  | total |
+---------+-------+
| antonio |     2 |
| juan    |     2 |
| leo     |     1 |
| pepe    |     1 |
+---------+-------+
4 rows in set (0.00 sec)

Observa que en el caso de PEPE, aunque hay dos registros que cumplen la condición, al hacer un DISTINCT DIA, sólo se cuenta una vez ya que es el mismo. finalmente, sólo tienes que filtrar aquellos registros QUE APARECEN DOS VECES, esto quiere decir que cumplen con ambas condiciones:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT nombre, COUNT(DISTINCT dia) total
    -> FROM
    ->   tabla
    -> WHERE dia IN ('dia1', 'dia2') and servicio = 'm'
    -> GROUP BY nombre
    -> HAVING COUNT(DISTINCT dia) = 2;
+---------+-------+
| nombre  | total |
+---------+-------+
| antonio |     2 |
| juan    |     2 |
+---------+-------+
2 rows in set (0.00 sec)

El ejercicio está en MySQL, pero usa sólo SQL Estándar, por lo que debería de funcionar en la mayoría de los DBMS's.

Haz la prueba y nos comentas,

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

CONSULTA SQL DOS VALORES

Publicado por ANTONIO (39 intervenciones) el 05/04/2018 20:45:59
Hola gracias por tu atención, verás estoy programado con el motor de access .mdb ado.net y no me funciona.
El ejemplo que quería explicar es el siguiente:
Imagínate que una empresa paga mensualmente a sus trabajadores con una compensación adicional si estos no caen enfermos los fines de semana. Es decir los fines de semana que el empleado trabaja el sábado y el domingo cobra una compensación con la condición de trabajar los dos días, en caso de fallar uno de los dos no cobra. Por eso por ejemplo es mes de marzo los fines de semana son:
dia3 y dia4
dia10 y dia11
dia17 y dia18
dia24 y dia25
Si por ejemplo pepe trabaja el dia3 y dia4 con servicio M cobra el plus. Si pepe el día3 su servico es B de baja porque esta enfermo y el día4 si que lo trabaja no lo cobra, o viceversa.
Obviamente cada sábado va con su domingo correspondiente no se puede coger un bloque de un día con otro día de otro bloque.
Por eso:
Nombre dia servicio
Antonio dia3 m
Antonio dia4 m ' cobraria el bloque
Pepe dia3 m
Pepe dia4 b ' no cobraria el bloque
Juan dia24 m
Juan dia25 m ' cobraria el bloque
Antonio dia17 m
Antonio dia18 m ' cobraria el bloque

Si te das cuenta Antonio que ha trabajado dos fines de semana completos cobraria dos veces el plus y necesitaria una consulta que el resultado de Antonio fuera 2, y el de Juan 1 y Pepe no aparecería o valor cero.

No se si me he explicado, gracias.
Saludos cordiales
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