2012-07-04 51 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.表HRM_blogquestion中的数据如下。在表HRM_Bloganswer

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

2.datas如下表HRM_Blogvote

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

3.datas如下

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 

所以,你的PROC是:

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。我已经更新了我的答案(最后),我认为你的存储过程看起来像。 –

+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