none
Calculo de porcentajes en sql con dos tablas

    Question

  • Hola buenas, estoy realizando un informe en reportviewer con vb.net 2005 y necesito calcular varios porcentajes. Tengo dos tablas de alquiler (que bien podría ser una, pero no...), cada alquiler se produce en una determinada provincia, pues bien necesito sacar el porcentaje de alquileres según la provincia.

    SELECT     Alquileres.id, Alquileres.PROVDEV
    FROM         Alquileres INNER JOIN
                          AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono
    GROUP BY  Alquileres.id, Alquileres.PROVDEV

    Esta consulta enlaza las tablas, provdev es la provincia, el campo id, es un identificador, que no es clave primaria, lo uso para sumar los id dependiendo de cualquier condición, usando un count(id) where localidad like 'Barcelona' -> de esa manera saco el número de alquileres en barcelona. Cómo podría sacar el porcentaje de cada localidad? Tendría que ser con un procedimiento almacenado?, sino cómo se podría hacer sin procedimiento almacenado?

     

    Os detallo las tablas

    Tabla Alquileres                       Tabla AlquileresSTR  

    id                                                bono

    bono                                           otros datos que no se usan, esta tabla sería como poner un estado en la   

                                                          tabla

    PROVDEV(localidad)               alquileres, pero no se puede cambiar ya, por complejidad del modelo de 

                                                      datos.

     

    Por favor si alquien tiene una idea de como sacarlo que lo comparta. Muchas gracias de antemano.

     

     

     

     


    • Edited by delgaillo Monday, January 30, 2012 4:53 PM
    Monday, January 30, 2012 4:51 PM

Answers

  • Hola, has probado

    SELECT    Alquileres.id, Alquileres.PROVDEV,

    COUNT(Alquileres.id) *100.0 / (SELECT COUNT(*) FROM Alquileres)

    FROM      Alquileres INNER JOIN
              AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono
    GROUP BY  Alquileres.id, Alquileres.PROVDEV

    Eso sí, esto solo funciona si SELECT COUNT(*) FROM Alquileres es igual a SELECT COUNT(*) FROM Alquileres INNER JOIN AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono

    Si no es igual (se pierden registros en el INNER JOIN), entonces lo podrías hacer con una CTE:

    ; WITH MisAlquileres AS (

    SELECT    Alquileres.id, Alquileres.PROVDEV, COUNT(Alquileres.id) AS Cuenta
    FROM      Alquileres INNER JOIN
              AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono
    GROUP BY  Alquileres.id, Alquileres.PROVDEV )

    SELECT Id, ProvDev, Cuenta * 100.0 / (SELECT SUM(Cuenta) From MisAlquileres)

    FROM MisAlquileres

    Saludos



     


    • Edited by Focus Media Tuesday, January 31, 2012 9:02 AM
    • Marked as answer by delgaillo Tuesday, January 31, 2012 11:10 AM
    Tuesday, January 31, 2012 9:02 AM
  •  Gracias Focus Media, muchísimas gracias, sin tu ayuda no lo habría sacado. He hecho una pequeñísima modificación, sino no me daba los datos correctos, ha quedado así:

    WITH MisAlquileres AS (

    SELECT     Alquileres.PROVDEV, COUNT(Alquileres.id) AS Cuenta
    FROM      Alquileres INNER JOIN
              AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono

    GROUP BY  Alquileres.PROVDEV )

    SELECT ProvDev, Cuenta * 100.0 / (SELECT SUM(Cuenta) From MisAlquileres

    )

    FROM MisAlquileres

    Muchas gracias, y espero que este post le sirve a mucha gente. Un saludo y gracias a Focus Media y al resto de personas que han respondido en este post.

    • Marked as answer by delgaillo Tuesday, January 31, 2012 11:10 AM
    Tuesday, January 31, 2012 10:19 AM

All replies

  • No entiendo. ¿Te refieres a obtener el porcentaje de alquileres sobre el total que supone cada provincia?
    Monday, January 30, 2012 5:12 PM
  • Exacto, de cada una de las provincias su porcentaje de alquileres, eso sería lo que quiero obtener.
    Monday, January 30, 2012 7:48 PM
  • Para obtener un tanto por ciento se construye una regla de tres simple. Ejemplo:
     
    Para calcular el % del total de PROVDEV se hace la regla de tres: multiplica cruzado y divideentre 100.

    Barcelona ==== 50 - count(id) where localidad like 'Barcelona' 33.33%
    
    Madrid ======= 32 - count(id) where localidad like 'Madrid' 21.33%
    
    Sevilla ====== 43 - count(id) where localidad like 'Sevilla' 28.66%
    
    Salamanca ==== 25 - count(id) where localidad like 'Salamanca' 16.66%
    
    =======================================================================
    
    Total ======= 150 - PROVDEVs                                   99.99%
    
    Si 100% == 150, que porciento hay en 50 == ??
    
    100 * 50 / 150 == 33.33
    
    SELECT    Alquileres.id, COUNT(Alquileres.id) * 100 / 150, Alquileres.PROVDEV
    FROM      Alquileres INNER JOIN
              AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono
    GROUP BY  Alquileres.id, Alquileres.PROVDEV

    Debera utilizar la clusula WHERE para filtrar los datos

    Porcentaje


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    My Blog
    Monday, January 30, 2012 8:19 PM
  • Esta consulta:
    SELECT    Alquileres.id, COUNT(Alquileres.id) * 100 / 150, Alquileres.PROVDEV
    FROM      Alquileres INNER JOIN
              AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono
    GROUP BY  Alquileres.id, Alquileres.PROVDEV

    tanto con claúsula where como si no, me devuelve 0. 150 se supone que es el total, pero no puedo hacer esa consulta a
    capón, tengo que sacar todo con un procedimiento almacenado o algo así. A capón no lo puedo poner, a parte que el resultado
    que me sale siempre es 0, si pongo 1500000 en lugar de 150 también me pone 0.
    Tuesday, January 31, 2012 8:31 AM
  • Hola, has probado

    SELECT    Alquileres.id, Alquileres.PROVDEV,

    COUNT(Alquileres.id) *100.0 / (SELECT COUNT(*) FROM Alquileres)

    FROM      Alquileres INNER JOIN
              AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono
    GROUP BY  Alquileres.id, Alquileres.PROVDEV

    Eso sí, esto solo funciona si SELECT COUNT(*) FROM Alquileres es igual a SELECT COUNT(*) FROM Alquileres INNER JOIN AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono

    Si no es igual (se pierden registros en el INNER JOIN), entonces lo podrías hacer con una CTE:

    ; WITH MisAlquileres AS (

    SELECT    Alquileres.id, Alquileres.PROVDEV, COUNT(Alquileres.id) AS Cuenta
    FROM      Alquileres INNER JOIN
              AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono
    GROUP BY  Alquileres.id, Alquileres.PROVDEV )

    SELECT Id, ProvDev, Cuenta * 100.0 / (SELECT SUM(Cuenta) From MisAlquileres)

    FROM MisAlquileres

    Saludos



     


    • Edited by Focus Media Tuesday, January 31, 2012 9:02 AM
    • Marked as answer by delgaillo Tuesday, January 31, 2012 11:10 AM
    Tuesday, January 31, 2012 9:02 AM
  •  Gracias Focus Media, muchísimas gracias, sin tu ayuda no lo habría sacado. He hecho una pequeñísima modificación, sino no me daba los datos correctos, ha quedado así:

    WITH MisAlquileres AS (

    SELECT     Alquileres.PROVDEV, COUNT(Alquileres.id) AS Cuenta
    FROM      Alquileres INNER JOIN
              AlquileresSTR ON Alquileres.BONO = AlquileresSTR.Bono

    GROUP BY  Alquileres.PROVDEV )

    SELECT ProvDev, Cuenta * 100.0 / (SELECT SUM(Cuenta) From MisAlquileres

    )

    FROM MisAlquileres

    Muchas gracias, y espero que este post le sirve a mucha gente. Un saludo y gracias a Focus Media y al resto de personas que han respondido en este post.

    • Marked as answer by delgaillo Tuesday, January 31, 2012 11:10 AM
    Tuesday, January 31, 2012 10:19 AM