none
tabla agrupada por 1 campo como sajar porcentajed sobre total de todo el grupo??? RRS feed

  • Pregunta

  • Hola  a todos no es facil pero intentare explicarve el problema que tengo . Reporting services 2005 tengo un dataset y una tabla sencilla con varias columnas agrupadas por un campo "sexo" que devuelve todos los datos de las columnas partidos en 2 filas "hombre" y "mujer" asi que me salen por ejemplo la suma de los socios tanto hombre cuanto mujer y y la transacciones ...y mas .
    Que pasa si quiero obtener un porcentaje de los socios partiods entre hombres y mujeres como da group, pero sobre el total de los socios hobre mas mujeres . No se como hacerlo porque seria una  =field!socios.value/ sum(field!socios.value) pero total de socios tanto hombres que mujeres . Como lo ago si automaticamnete la tabla agrupa por sexo ????

    sexo     tot. socios   %
    h          100             66  ????????
    m         50               44  ?????????
    • Cambiado Fran DiazModerator lunes, 8 de junio de 2009 9:40 Reporting ([Loc]From:SQL Server)
    jueves, 4 de junio de 2009 13:07

Respuestas

  • La idea detras de runningvalue es usar los datos del reporte y no los del dataset.
    Te permite por ejemplo calcular un acumulado fila a fila.

    Aun no entendi como puedes filtrar por ciudad.

    En el caso de BO tiene una tecnologia que se llama aggregation aware que te permite mejorar la performance, en SQL Server lo que debes usar es Analisys services para tener algo parecido. AS es mucho mas potente que BO en ciuanto a prestaciones. En cuanto a usar solo SQL, lo mas cercano es usar vistas idexadas en SQL Server lo que en Oracle se conoce como vistas materializadas. Eso te debeira permitir mejorar el rendimiento de este tipo de reportes.


    Espero te sirva la idea.


    Saludos


    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 (Cambia los ceros por O y saca lo que sobra) Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    martes, 9 de junio de 2009 0:39

Todas las respuestas

  • Si queres podrias resolverlo en el procedimiento almacenado o la query que usas.

    Select @tot = select count(*) from tabla

    Select sexo, count(*) , count(*) /@tot
    from tabla
    group by sexo


    Saludos

    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 (Cambia los ceros por O y saca lo que sobra) Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    jueves, 4 de junio de 2009 18:51
  • Hola Jose me alegro que nos ajonsejamos entre ingenieros!!! Mira esa solucion ya la probe y claro functiona pero yo necesito hacer esos calculos directamente en el report porque la consulta ya es bastante gorda y tarda mucho en esejutrase,y ademas sobre todo porque quiero aprender bien todas la funcionalidades del reporting y soy seguro que habra manera de hacerlo


    muchas gracias
    saludos
    viernes, 5 de junio de 2009 7:41
  • Podrias resolverlo con una expresion del tipo =Fields!salesdue.Value/Sum(Fields!salesdue.Value, "DataSet1")

    Saludos


    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 (Cambia los ceros por O y saca lo que sobra) Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    viernes, 5 de junio de 2009 13:17
  • ya verdad asi lo he solucionado pero luego hay otro problema imagina que esa tabla la filtro por otr campo por ejemplo ciudad=madrid en ese caso el sigue sajandome el porcentaje sobre el total de socios tanto hombre cuanto mujeres pero de todas la ciudades!!!!ahora eso es mi nuevo problema!
    viernes, 5 de junio de 2009 13:29
  • Eso resultado no lo tienes en tu reporte a menos que lo agregues un grupo y lo calcules en base a ese grupo.
    Es algo asi por ejemplo:

    SELECT        TerritoryID, SalesPersonID, SUM(TotalDue) AS salesdue
    FROM            Sales.SalesOrderHeader
    WHERE        (SalesPersonID IS NOT NULL)
    GROUP BY SalesPersonID, TerritoryID
    ORDER BY TerritoryID, SalesPersonID


    Si agregas un grupo por territorio y se llama "table1_TerritoryID" debes cambiar el SCOPE del SUM.

    =Fields!salesdue.Value/Sum(Fields!salesdue.Value,

    "table1_TerritoryID")

    Saludos



    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 (Cambia los ceros por O y saca lo que sobra) Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    viernes, 5 de junio de 2009 16:14
  • Hola Jose gracias por la respuesta, el finde no trabajo y no puedo intentarlo en casa de toda forma mi consulta es mas complicada, el lunes te la paso y veras....
    de toda forma el group ya esta creado ...lo que necesito es algo en expression que me permita decirle de sajar el total pero solo por la ciudad incluida en el filtro...!
    sábado, 6 de junio de 2009 14:25
  • Te sugiero que envies toda la informacion necesaria y que si la pregunta es diferente abramos otra nueva y que cierres esta para que alguien pueda aprovechar la respuesta y sea mas facil para todos .

    Buen fin de semana

    Saludos
    .


    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 (Cambia los ceros por O y saca lo que sobra) Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    sábado, 6 de junio de 2009 15:02
  • pUES MEJOR SEGUIR EN ESA PREGUNTA PORQUE EL PROBLEMA ES LO MISMO : de toda forma el problema dudo sea en la consulta, debe haber la manera de utilizar el total considerando el filtro por ciudad como te comente antes:

    (ya verdad asi lo he solucionado pero luego hay otro problema imagina que esa tabla la filtro por otr campo por ejemplo ciudad=madrid en ese caso el sigue sajandome el porcentaje sobre el total de socios tanto hombre cuanto mujeres pero de todas la ciudades!!!!ahora eso es mi nuevo problema!)

       De toda forma te aadjunto mi consulta sql ..


    select s.sexo, s.tramo_edad , s.provincia , s.id_pais,
               count (distinct s.cod_pers) Socios ,
           count (distinct p.id_bin || p.tarjeta) Socios_Activos ,
           sum(p.litros) Litros,
           count (distinct p.id_trans) Txns ,
                      sum(p.importe) Importe, sum(p.p_basic) P_Basicos,
           sum(p.p_extra) P_Extra, sum(p.p_shop) P_Tienda,
           sum(p.p_promo) P_Promo, sum(p.p_redimidos) P_Redimidos,
           sum(p.puntos) Puntos,
           sum(p.p_extra) / case when sum(p.p_basic)  = 0 then 1
                                                 else sum(p.p_basic) 
                                      end P_hab_vs_P_basic,
           ((sum(p.p_shop) + sum(p.p_promo))/case when sum(p.p_basic)  = 0 then 1
                                                 else sum(p.p_basic) 
                                            end ) P_promo_VS_P_basic
    from fp_socios s, fp_altas a ,
         (select id_bin,
                 tarjeta , litros,
                 id_trans, importe, p_basic, p_extra, p_shop,
                 p_promo, p_redimidos, puntos
         from fp_transacc_producto
         where ano = :ano)p
    where s.id_bin = p.id_bin (+)
    and s.tarjeta = p.tarjeta (+)
    and s.id_bin = a.id_bin
    and s.tarjeta = a.tarjeta
    and s.provincia is not null
    group by s.sexo, s.tramo_edad , s.provincia,s.id_pais

     

    lunes, 8 de junio de 2009 8:06
  • No entiendo como podrias filtrar en el reporte por ciudad si no esta en la  tabla resultante de la consulta.

    Para tener resultados del tipo subtotales por los cuales dividir podrias aplicar agrupamiento y lo que te comente.

    Si lo que quieres es usar los datos mostrados en el reporte podras utilizar la funcion runnigvalue(). Deberas tener en cuenta los scope.

    Otro detalle a tener en cuenta es que en tu consulta no tiene sentido la tabla derivada. Podrias usar directamente un join.
    Ademas NO estas usando el formato ANSI de joins por lo que sospecho que o no tienes una base de datos sql server o el driver te esta resolviendo la consulta con lo cual es probable que lo lento se deba a eso.

    Saludos


    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 (Cambia los ceros por O y saca lo que sobra) Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    lunes, 8 de junio de 2009 12:58
  • PUES me he perdido un poco ...
    la base esta en oracle..no se porque pero tarda bastante , lo del join ni idea ...
    la idea de la expression runnigvalue la verdad no la conosco!!!
    El tema es que yo antesa trabajava con business object y desde un mes me han dicho de mudar todo a reporting services que para me es del todo nueva...y lo voy aprendiendo ...dia a dia!

    De toda forma gracias
    lunes, 8 de junio de 2009 13:14
  • La idea detras de runningvalue es usar los datos del reporte y no los del dataset.
    Te permite por ejemplo calcular un acumulado fila a fila.

    Aun no entendi como puedes filtrar por ciudad.

    En el caso de BO tiene una tecnologia que se llama aggregation aware que te permite mejorar la performance, en SQL Server lo que debes usar es Analisys services para tener algo parecido. AS es mucho mas potente que BO en ciuanto a prestaciones. En cuanto a usar solo SQL, lo mas cercano es usar vistas idexadas en SQL Server lo que en Oracle se conoce como vistas materializadas. Eso te debeira permitir mejorar el rendimiento de este tipo de reportes.


    Espero te sirva la idea.


    Saludos


    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 (Cambia los ceros por O y saca lo que sobra) Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    martes, 9 de junio de 2009 0:39
  • ...PERDONA LA CIUDAD INTENDIA "PROVINCIA"!!!

    Lo del runnig values tiene que ser muy util porque seguro me da la posibilidad tambien de refermirme a un subtotal?!!?

    Por lo de las vistas materializadas ...es lo suyo,son mas rapidas ...pero yo me limito a utilizar la base para hacer informes y no me dejan modificarla!:)

    De toda froma muchas gracias ha sido muy util de verdad!!

    Saludos Michele

    martes, 9 de junio de 2009 9:00