2012-07-04 2 views
0
Id Answer NoOfComments 
18  1  2 
19  2  0 
20  3  0 
21  4  0 
22  5  1 

Данные, приведенные выше, являются выходными данными, полученными из следующего StoredProcedure.Чтобы найти процент от NoOfComments

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 

Теперь мне нужно найти процентное значение каждого ответа в соответствии с значением в поле NoOfComments. Я могу дать дополнительную информацию. 1.datas в таблице HRM_blogquestion следующим образом.

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

2.datas в таблице HRM_Bloganswer следующим

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

3.datas в таблице HRM_Blogvote следующим

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

Из этих таблиц DATAS я пишу выше SP И теперь мне нужно чтобы найти процент голосов для ответа

Пожалуйста, помогите мне решить эту проблему.

+1

ли результат (от вашего образец) 66%, 0%, 0%, 0%, 33% (для каждого из 5 рядов)? Если нет, какой процент будет рассчитываться? Всегда будет только 5 строк? Если нет, всегда ли это во всей таблице или есть ли еще один столбец, который идентифицирует связанные строки? –

+0

Результат такой же, как и у. но это не всегда 5 строк – Ramdas

ответ

1

Вместо того, чтобы создавать эту таблицу @Results, вы можете превратить свой существующий запрос в common table expression и запросить его вместо этого. Окончательный запрос является тот, который вы хотите:

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 

Результат:

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 

Итак, ваш прок будет:

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 
+0

здесь NoOfComments - это не поле в таблице. Оно показано только на выходе вышеуказанного SP. , (SELECT COUNT (*) FROM HRM_BlogVote WHERE HRM_BlogVote.AnswerId = [HRM_BlogAnswer]. [Id]) AS NoOfComments - это запрос, показывающий поле NoOfComments на выходе – Ramdas

+0

@Ramdas - вот что я имел в виду в первом абзаце, где Я сказал, что вы конвертируете существующий запрос в CTE. Я обновил свой ответ (в конце) с тем, что, на мой взгляд, будет выглядеть ваш сохраненный proc. –

+0

Уважаемый Дамиен, Большое спасибо за вашу помощь. Теперь я отвечаю на мое требование. Большое спасибо. – Ramdas

0
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 
+0

В приведенном выше ответе может возникнуть проблема во время NoOfComments равно 0. Это деление на 0 невозможно. Я думаю, что этот ответ решит эту проблему. – Ramdas

+0

Могу ли я использовать этот пример @Damien – Ramdas

Смежные вопросы