Estoy tratando de escribir una consulta para imprimir el número máximo de tours con descuento entre los que una familia puede elegir. Por ejemplo, la familia Thomas puede elegir entre cualquiera de los 3 recorridos y calificar para el descuento. La familia Chris solo califica para 1.

A continuación se muestra la tabla de países:

Country    min_size
Bolivia       2
Brazil        4
China         9

A continuación se muestra la tabla de familias:

Name     fam_size
Thomas        9
Chris         2

Aquí está mi código, pero creo que es incorrecto a pesar de que funciona bien. Gracias de antemano.

select name, count(countries.*) as cnt
from countries, families
where family_size <= min_size
group by 1
sql
0
Kay 14 mar. 2021 a las 12:07

3 respuestas

La mejor respuesta

Puede usar la combinación interna (para que la consulta sea más legible) y nombrar en grupo por cláusula.

select name, count(country) as cnt
from families f inner join countries c
on f.family_size >= c.min_size
group by name
1
Kazi Mohammad Ali Nur 14 mar. 2021 a las 10:44

Si no desea utilizar Joining, puede probar el siguiente código =>
MySQL: enlace db-fiddle .
Oracle: enlace sql-fiddle .

SELECT Name,
       (Select COUNT(*) FROM Country Where Country.min_size<=Family.fam_size) AS tours
FROM 
Family;

Nota: este código puede ser un poco lento. No estoy seguro. Siempre puedes comprobar el rendimiento.

2
SJNF 14 mar. 2021 a las 10:34

Usar Outter Apply es otra opción:

SELECT f.Name,res.cnt
FROM 
Family f OUTER APPLY
( Select COUNT(*) cnt FROM Country Where c.min_size<=f.fam_size) res
1
Abolfazl 14 mar. 2021 a las 11:33