SQL - ayuda.. necesito hacer una consulta de una tabla con varias condiciones

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

ayuda.. necesito hacer una consulta de una tabla con varias condiciones

Publicado por Javier (3 intervenciones) el 10/05/2017 04:57:20
buenas amigos, necesito de alguien que me ayude o me oriente porque no se como hacer una consulta como dice el titulo son varias condiciones en una misma tabla......los valores de la BD es algo como esto:

piloto escuderia puntos pole position
nino alfa 9 1
juan m alfa 6 3
luigi alfa 4 2
reg talbot 3 5
yves talbot 2 4
bob era 0 7
cuth talbot 0 8
david era 0 9
joe maserati 0 6
prince maserati 0 11
geoff maserati 0 10
nino alfa 9 2
cuth talbot 6 1
david era 4 3
joe maserati 3 4
juan m alfa 2 5
prince maserati 0 7
geoff maserati 0 8
luigi alfa 0 10
reg talbot 0 11
yves talbot 0 6
bob era 0 9
juan m alfa 9 2
luigi alfa 6 3
nino alfa 4 1
yves talbot 3 4
bob era 1 6
cuth talbot 1 8
david era 0 7
joe maserati 0 10
prince maserati 0 11
geoff maserati 0 9

ahora lo que necesito es que muestre todos los pilotos sin repetirse, que a su vez sume el valor de los puntos y que cuente los pilotos que obtuvieron la pole = '01' sino pole='0' para el resto de los mismos...

bien yo tengo el codigo pero por separado y el count nada mas muestra los elemento con la coincidencia '01'...


para el caso de la suma de los valores en los puntos de los pilotos es:
select distinct cod_piloto,sum(cast(puntos as numeric)) as punto from carreras where cod_piloto in (select cod_piloto from carreras) group by cod_piloto order by cod_piloto

el resultado da:

piloto puntos pole position
nino 22 2
juan m 17 0
luigi 10 0
cuth 7 1
david 4 0
......... y asi sucesivamente muestra el resto de los datos de la BD, hago la salvedad que la columna escudera no me la mostra

para contar los pilotos que obtuvieron la pole='01' sino pole='0' es:
select distinct cod_piloto,count(pole_position) as pole from carreras where pole_position='01' and cod_piloto in (select cod_piloto from carreras) group by cod_piloto order by cod_piloto

piloto escuderia pole position
nino alfa 2
cuth talbot 1
pero en este caso no muestra el resto de los pilotos con pole position en 0 porque no se como hacer esa condicion y tampoco muestra la escuderia ya que como el caso anterior no la muestra

por tanto les agradezco de su ayuda u orientacion , todo esto lo hago para una pagina web pero queria hacerla usando puro sql sino quiza me tocaria usar arreglos pero bueno espero me ayuden ...gracias de antemano compas....
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

ayuda.. necesito hacer una consulta de una tabla con varias condiciones

Publicado por Isaias (1921 intervenciones) el 10/05/2017 16:51:25
¿Con 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: 5
Ha disminuido su posición en 4 puestos en SQL (en relación al último mes)
Gráfica de SQL

ayuda.. necesito hacer una consulta de una tabla con varias condiciones

Publicado por Javier (3 intervenciones) el 11/05/2017 23:24:14
buenas tardes es verda.. se me escapaba escribirle que el manejador de BD es postgresql....
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

ayuda.. necesito hacer una consulta de una tabla con varias condiciones

Publicado por leonardo_josue (1173 intervenciones) el 10/05/2017 17:39:55
Hola Javier:

No sé si terminé de entender correctamente tu problema, pero veamos si es más o menos así.

Primero, no nos dices de qué tipo de dato son tus campos, dado que haces algunas conversiones para hacer la suma, puedo suponer que tus campos PUNTOS y POLE_POSITION son de tipo caracter, lo cual es un terrible error: si almacenas valores entonces el tipo tiene que ser numérico, así te evitas conversiones innecesarias.

No nos dices con que BD's estás trabajando, para el ejemplo lo voy a hacer con MySQL y trataré de usar sólo SQL estandar. Supongamos que tu tablas es más o menos 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
36
37
38
mysql> SELECT * FROM tabla;
+--------+-----------+--------+---------------+
| piloto | escuderia | puntos | pole_position |
+--------+-----------+--------+---------------+
| nino   | alfa      |      9 |             1 |
| juan m | alfa      |      6 |             3 |
| luigi  | alfa      |      4 |             2 |
| reg    | talbot    |      3 |             5 |
| yves   | talbot    |      2 |             4 |
| bob    | era       |      0 |             7 |
| cuth   | talbot    |      0 |             8 |
| david  | era       |      0 |             9 |
| joe    | maserati  |      0 |             6 |
| prince | maserati  |      0 |            11 |
| geoff  | maserati  |      0 |            10 |
| nino   | alfa      |      9 |             2 |
| cuth   | talbot    |      6 |             1 |
| david  | era       |      4 |             3 |
| joe    | maserati  |      3 |             4 |
| juan m | alfa      |      2 |             5 |
| prince | maserati  |      0 |             7 |
| geoff  | maserati  |      0 |             8 |
| luigi  | alfa      |      0 |            10 |
| reg    | talbot    |      0 |            11 |
| yves   | talbot    |      0 |             6 |
| bob    | era       |      0 |             9 |
| juan m | alfa      |      9 |             2 |
| luigi  | alfa      |      6 |             3 |
| nino   | alfa      |      4 |             1 |
| yves   | talbot    |      3 |             4 |
| bob    | era       |      1 |             6 |
| cuth   | talbot    |      1 |             8 |
| david  | era       |      0 |             7 |
| joe    | maserati  |      0 |            10 |
| prince | maserati  |      0 |            11 |
| geoff  | maserati  |      0 |             9 |
+--------+-----------+--------+---------------+
32 rows in set (0.00 sec)

donde como te comento, las columnas de PUNTOS y POLE_POSITION son de tipo entero por lo tanto no hay necesidad de hacer las conversiones (si no puedes cambiar tu modelo, entonces tendrías que hacer las conversiones pertinentes pero los resultados pueden no ser los esperados si es que tienes algún valor que no sea numérico).

Ahora bien, la idea de tus querys es más o menos correcta, pero tienes algunas cosas inútiles:

1. No es necesario que pongas DISTINCT ya que a final de cuentas va a AGRUPAR por el nombre de los pilotos, por lo tanto nunca se van a repetir.

2. No es necesario que pongas esta condición:

1
cod_piloto in (select cod_piloto from carreras)

dado que estás haciendo referencia sobre la misma tabla, esto es redundante... es como si le dijeras a alguien que te diga un NÚMERO PAR que además sea divisible entre 2, esto es redundante porque un número par siempre es divisible entre 2... lo mismo pasa con tu consulta.

3. cuando dices que no te aparece la escudería es porque NO LA ESTÁS INCLUYENDO EN LA CONSULTA... debes ponerla en el SELECT y sólo incluirla también en el GROUP BY...

4. finalmente, para el conteo de las POLE_POSITION para cada piloto, puedes utilizar la técnica del SUM-CASE-WHEN, que básicamente es lo mismo que las sumas i = i +1 de la programación convencional...

La consulta podría quedar entonces 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
mysql> SELECT
    ->   piloto,
    ->   escuderia,
    ->   SUM(puntos) total_puntos,
    ->   SUM(CASE WHEN pole_position = 1 THEN 1 ELSE 0 END) total_pole_position
    -> FROM
    ->   tabla
    -> GROUP BY piloto, escuderia
    -> ORDER BY 3 DESC;
+--------+-----------+--------------+---------------------+
| piloto | escuderia | total_puntos | total_pole_position |
+--------+-----------+--------------+---------------------+
| nino   | alfa      |           22 |                   2 |
| juan m | alfa      |           17 |                   0 |
| luigi  | alfa      |           10 |                   0 |
| cuth   | talbot    |            7 |                   1 |
| yves   | talbot    |            5 |                   0 |
| david  | era       |            4 |                   0 |
| joe    | maserati  |            3 |                   0 |
| reg    | talbot    |            3 |                   0 |
| bob    | era       |            1 |                   0 |
| geoff  | maserati  |            0 |                   0 |
| prince | maserati  |            0 |                   0 |
+--------+-----------+--------------+---------------------+
11 rows in set (0.02 sec)

Dale un vistazo para ver si esto es lo que necesitas y si continuas con problemas comenta y tratamos de resolverlo.

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

ayuda.. necesito hacer una consulta de una tabla con varias condiciones

Publicado por Javier (3 intervenciones) el 11/05/2017 23:52:41
buenas tardes amigo disculpe pero se me olvido comentar que el manejador de BD que uso es postgresql, y si probe tu query esta perfectamente es lo que necesitaba compa la verdad es que ni idea de esa funcion sum(case if then else end) que reemplaza un poco al count... por otra parte si en la bd los campos los defini de tipo character y si tiene razon estoy impelmentando tu sugerencia compa
estoy cambiando los que deberian ser numericos....mil gracias compa por esas sugerencias y por tu query.... ME SALVASTES...jejejeje valgame dios
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