none
Ayuda con consulta sql RRS feed

  • Pregunta

  • Buenos días, estoy teniendo un gran problema para lograr una consulta sql, es un ejercicio planteado por lo tanto no puedo cambiar la estructura del sistema, solamente debo encontrar una solución a esta estructura :

    create table cities (id int identity(1,1), name varchar(50))
    insert into cities values ('Aa')
    insert into cities values ('Bb')
    insert into cities values ('cc')
    insert into cities values ('dd')
    insert into cities values ('ff')

    create table people (id int identity(1,1), name varchar(50), city int, wage varchar(50))
    insert into people values ('a', 2, '$90,000')
    insert into people values ('b', 2, '$24,000')
    insert into people values ('c', 1, '70000')
    insert into people values ('d', 3, '$100,000.00')
    insert into people values ('e', 5, '56,000')
    insert into people values ('f', 4, '$62000')
    insert into people values ('g', 3, '250000')

    Bien, yo tengo que el siguiente problema, debo realizar una consulta con la cual pueda conseguir el nombre de una ciudad y su respectivo promedio de salarios. Por ejemplo ciudad: bb promedio:57000.

    El primer paso que se me ocurrió fue realizar esta consulta:

    Select cities.name as name, Cast(Replace(Replace(wage,'$',''),',','') As real) as wage
    From people 
    inner join cities 
    on people.city=cities.id

    con la cual obtengo los nombres de las ciudades y los salarios, pero me faltaría lograr utilizando avg y where o de otra forma hacer el promedio basándome en esa consulta. 

    La consulta que realice hasta el momento fue con el objetivo de pasar los valores varchar a real para luego poder utilizar avg.

    • Editado CRoupeiro viernes, 18 de agosto de 2017 17:21
    viernes, 18 de agosto de 2017 17:20

Respuestas

  • Para calcular el promedio, ponle en la lista de selección la función AVG:

    Select ... AVG(Cast(Replace(Replace(wage,'$',''),',',''))...

    Y para que el promedio sea "por ciudad", ponle al final de la sentencia una cláusula "group by":

    GROUP BY cities.name

    • Propuesto como respuesta Willams Morales viernes, 18 de agosto de 2017 17:30
    • Marcado como respuesta CRoupeiro viernes, 18 de agosto de 2017 17:50
    viernes, 18 de agosto de 2017 17:23

Todas las respuestas

  • Para calcular el promedio, ponle en la lista de selección la función AVG:

    Select ... AVG(Cast(Replace(Replace(wage,'$',''),',',''))...

    Y para que el promedio sea "por ciudad", ponle al final de la sentencia una cláusula "group by":

    GROUP BY cities.name

    • Propuesto como respuesta Willams Morales viernes, 18 de agosto de 2017 17:30
    • Marcado como respuesta CRoupeiro viernes, 18 de agosto de 2017 17:50
    viernes, 18 de agosto de 2017 17:23


  • CREATE PROCEDURE  tu_procedimiento ()

    begin

    Select cities.name ,IF( funcion(wage), wage * v_dolar,wage )

    From people 
    inner join cities 
    on people.city=cities.id

    end

    Deberias usar una funcion pero antes de eso , dime si contiene $  No se supone que se multiplique x el tipo de cmabio para asi obtener un resultado optimo? supongo los uqe no tienen $ son otro tipo de cambio


    Pasa los puntos prro v:

    viernes, 18 de agosto de 2017 17:34
  • Alberto muchisimas gracias por responder,

    te cuento que probe de esta forma:

    Select cities.name ,avg( Cast(Replace(Replace(wage,'$',''),',','') As real)) group by cities.name
    From people 
    inner join cities 
    on people.city=cities.id

     

    y me da error


    • Editado CRoupeiro viernes, 18 de agosto de 2017 17:43
    viernes, 18 de agosto de 2017 17:39
  • son todos el mismo tipo de cambio, en realidad yo lo que hice es obtener el valor numerico quitandole todos los demas caracteres
    viernes, 18 de agosto de 2017 17:44
  • No fui yo quien respondió, te respondió Alberto, yo corroboré su respuesta como correcta.

    Respecto al error, la cláusula GROUP BY va luego de la cláusula FROM.

    SELECT 
        cities.name as name, 
        AVG(CAST(REPLACE(REPLACE(wage, '$', ''), ',', '') AS decimal(9,2))) AS Average
    FROM 
        people 
        INNER JOIN cities ON people.city = cities.id
    GROUP BY cities.name


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    viernes, 18 de agosto de 2017 17:45
  • Si ya vi, soy nuevo en el foro y recién estoy comprendiendo como funciona, ya logre el resultado, muchisimas gracias gente
    viernes, 18 de agosto de 2017 17:49