Para encontrar el porcentaje de NoOfComments

Id  Answer  NoOfComments
18      1        2
19      2        0
20      3        0
21      4        0
22      5        1

Los datos proporcionados anteriormente son el resultado obtenido del siguiente StoredProcedure.

 ALTER PROCEDURE [dbo].[BlogAnswerByQuestionId]
(
    @QuestionId int
)
AS
BEGIN
    SELECT [HRM_BlogAnswer].[Id] as Id
          ,[HRM_BlogAnswer].[Answer]
          ,(SELECT COUNT(*) FROM HRM_BlogVote  WHERE HRM_BlogVote.AnswerId  =[HRM_BlogAnswer] .[Id]) AS NoOfComments

        FROM [HRM_BlogAnswer] 
    WHERE [HRM_BlogAnswer].[QuestionId] = @QuestionId


END

Ahora necesito encontrar el valor porcentual de cada respuesta según el valor en el campo NoOfComments. Puedo dar algo más de información. 1.datos en la tabla HRM_blogquestion de la siguiente manera.

Id  Question    CreatedDate          CreatedBy
8   tttt    2012-07-03 17:36:47.513        1

2.datos en la tabla HRM_Blogrespuesta de la siguiente manera

Id  QuestionId  Answer
18  8             1
19  8             2
20  8             3
21  8             4
22  8             5

3.datos en la tabla HRM_Blogvote de la siguiente manera

Id  QuestionId  AnswerId    EmployeeId
19  8                18        1
23  8                22        24
24  8                18        25

A partir de estos datos de la tabla, escribo el SP anterior y ahora necesito encontrar el porcentaje de respuestas votadas.

Por favor ayúdame a solucionar esto.

preguntado el 04 de julio de 12 a las 10:07

¿Es el resultado (de su muestra) 66%,0%,0%,0%,33% (para cada una de las 5 filas)? De no ser así, ¿qué porcentaje se espera calcular? ¿Siempre habrá solo 5 filas? Si no, ¿es siempre en toda la tabla o hay alguna columna adicional que identifique las filas relacionadas? -

El resultado es el mismo que das. pero no siempre son 5 filas -

2 Respuestas

En lugar de crear esta tabla @Results, puede convertir su consulta existente en una expresión de tabla común, y consulta eso en su lugar. La consulta final es la que desea:

declare @Results table (
    Id int not null,
    Answer int not null,
    NoOfComments int not null
)
insert into @Results (Id,Answer,NoOfComments) values
(18,      1,        2),
(19,      2,        0),
(20,      3,        0),
(21,      4,        0),
(22,      5,        1)

select *,((NoOfComments * 100.0) / SUM(NoOfComments) OVER (PARTITION BY (1))) as Pcnt
from @Results

Resultado:

Id          Answer      NoOfComments Pcnt
----------- ----------- ------------ ---------------------------------------
18          1           2            66.666666666666
19          2           0            0.000000000000
20          3           0            0.000000000000
21          4           0            0.000000000000
22          5           1            33.333333333333

Entonces, su proceso sería:

 ALTER PROCEDURE [dbo].[BlogAnswerByQuestionId]
(
    @QuestionId int
)
AS
BEGIN
    ;With Results as (
    SELECT [HRM_BlogAnswer].[Id] as Id
          ,[HRM_BlogAnswer].[Answer]
          ,(SELECT COUNT(*) FROM HRM_BlogVote  WHERE HRM_BlogVote.AnswerId  =[HRM_BlogAnswer] .[Id]) AS NoOfComments

        FROM [HRM_BlogAnswer] 
    WHERE [HRM_BlogAnswer].[QuestionId] = @QuestionId
    )
    select *,((NoOfComments * 100.0) / SUM(NoOfComments) OVER (PARTITION BY (1))) as Pcnt
    from Results

END

Respondido 04 Jul 12, 11:07

aquí NoOfComments no es un campo en la tabla. Se muestra solo en la salida del SP anterior. ,(SELECT COUNT(*) FROM HRM_BlogVote WHERE HRM_BlogVote.AnswerId =[HRM_BlogAnswer] .[Id]) AS NoOfComments es la consulta para mostrar el campo NoOfComments en la salida - Ramdas

@Ramdas: a eso me refería en mi primer párrafo, donde dije que convertiría su consulta existente en un CTE. Actualicé mi respuesta (al final) con lo que creo que sería su proceso almacenado. - damien_el_incrédulo

Estimado Damián, Muchas gracias por tu ayuda. Ahora cumplo con mi requerimiento. Muchísimas gracias. - Ramdas

ALTER PROCEDURE [dbo].[BlogAnswerByQuestionId] 
(     
@QuestionId int 
) 
AS 
BEGIN    
WITH Results 
AS 
    (     
        SELECT [HRM_BlogAnswer].[Id] as Id           
              ,[HRM_BlogAnswer].[Answer]           
              ,(SELECT COUNT(*) FROM [HRM_BlogVote]  WHERE [HRM_BlogVote].[AnswerId]  =[HRM_BlogAnswer].[Id]) AS NoOfComments          
          FROM [HRM_BlogAnswer]      
        WHERE [HRM_BlogAnswer].[QuestionId] = @QuestionId     
    )     
        SELECT *,
        case when NoOfComments>0 then  ((NoOfComments * 100.0) / SUM(NoOfComments) OVER (PARTITION BY (1))) else 0 end as Percentage    
            FROM Results  
END 

Respondido 09 Jul 12, 13:07

En la respuesta anterior, puede ocurrir un problema cuando NoOfComments es 0. No es posible dividir por 0. Creo que esta respuesta resolverá ese problema. - Ramdas

¿Puedo usar este ejemplo @Damien - Ramdas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.