2015-07-21 86 views
-1

我正在处理的表格是某些问题的答案记录。我想找出人们对470,477,479,481,483问题中提供者23的肯定,肯定的百分比。所以我试图计算答案的总数和'是的,肯定'的答案。我可以分开做,但不能在一张桌子上加入。如何将同一张表的两个不同计数结合在一起?

一个查询是获取表SurveyAnswerFact中记录的总数。

SELECT SurveyQuestionKey, count(1) 
FROM [WAREHOUSE].[dbo].[SurveyAnswerFact] 
WHERE ([ProviderKey] = 23) 
AND ([SurveyQuestionKey] IN (470,477,479,481,483))   
AND ([Response] = 'Yes, definitely') 
AND ([ResponseDateKey] BETWEEN 20140601 AND 20150531) 
GROUP BY SurveyQuestionKey 

结果:

470 44 
477 40 
479 43 
481 43 
483 44 

另一个查询获得是 '是的,绝对是'

SELECT SurveyQuestionKey, count(1) 
FROM [WAREHOUSE].[dbo].[SurveyAnswerFact] 
WHERE (ProviderKey = 23) 
AND (SurveyQuestionKey IN (470,477,479,481,483)) 
AND ([ResponseDateKey] BETWEEN 20140601 AND 20150531) 
GROUP BY SurveyQuestionKey 

结果答案的计数:

470 43 
477 39 
479 35 
481 42 
483 39 

我试图用SQL将它们连接在一起,但是结果与第一个查询的结果相同。我的预期结果是这样的:

470 43 44 
477 39 40 
479 35 43 
481 42 43 
483 39 44 

任何人都可以教我正确的方式加入他们?

+1

有什么问题吗?两个不同的东西是什么?提供一些样本数据和预期结果... – xQbert

+0

我刚刚编辑了这个问题。我正在测试代码块是否工作:)。堆栈溢出的第一个问题。谢谢。 – JJJJ

+0

编辑的问题要容易理解多了:P – xQbert

回答

0

也许你的意思是......

我所做的就是消除其中的响应条款,并把它添加到被选择和组。

SELECT SurveyQuestionKey, Response, count(1) 
    FROM [WAREHOUSE].[dbo].[SurveyAnswerFact] 
    WHERE ([ProviderKey] = 23) 
     AND ([SurveyQuestionKey] IN (470,477,479,481,483))   
     AND ([ResponseDateKey] BETWEEN 20140601 AND 20150531) 
    GROUP BY SurveyQuestionKey, Response 

-------------- UPDATE基于新的信息---------

有几个方法可以做到这一点。使用案例声明

SELECT SurveyQuestionKey, count(1) as Totalcount, sum(case when Response = 'Yes, definitely' then 1 else 0 end) as [Yes Def] 
FROM [WAREHOUSE].[dbo].[SurveyAnswerFact] 
WHERE ([ProviderKey] = 23) 
AND ([SurveyQuestionKey] IN (470,477,479,481,483))   
AND ([ResponseDateKey] BETWEEN 20140601 AND 20150531) 
GROUP BY SurveyQuestionKey 

另一种方法是按照您的建议加入表格,但这会产生更多开销。 (这使用了公共表为每个查询,使加盟更易于阅读。)

With totalCount as (SELECT SurveyQuestionKey, count(1) cnt 
FROM [WAREHOUSE].[dbo].[SurveyAnswerFact] 
WHERE ([ProviderKey] = 23) 
AND ([SurveyQuestionKey] IN (470,477,479,481,483))   
AND ([Response] = 'Yes, definitely') 
AND ([ResponseDateKey] BETWEEN 20140601 AND 20150531) 
GROUP BY SurveyQuestionKey), 

YesDefCount as (SELECT SurveyQuestionKey, count(1) cnt 
FROM [WAREHOUSE].[dbo].[SurveyAnswerFact] 
WHERE ([ProviderKey] = 23) 
AND ([SurveyQuestionKey] IN (470,477,479,481,483))   
AND ([ResponseDateKey] BETWEEN 20140601 AND 20150531) 
GROUP BY SurveyQuestionKey) 

SELECT surveyQuestionKey, totalcount.cnt, yesDefCount.count 
from totalcount A 
LEFT JOIN YESDEFCOUNT B 
on A.SurveyQuestionKey = B.SurveyQuestionKey; 
+0

嗨,我刚刚编辑了这个问题。你能再看一遍吗?谢谢! – JJJJ

+0

我收到了“消息195,级别15,状态10,行1 ”总和“不是一个公认的内置函数名称。”第一个错误...我用Google搜索了一下,但我不明白......你能再帮忙吗? – JJJJ

+0

哦,我的上帝,我''结束'后'添加')。有用!非常感谢! – JJJJ

0
SELECT SurveyQuestionKey, count(1), x.totals 
    FROM [WAREHOUSE].[dbo].[SurveyAnswerFact], 
     (select count(1) totals from [WAREHOUSE].[dbo].[SurveyAnswerFact]) x 
WHERE ([ProviderKey] = 23) 
    AND ([SurveyQuestionKey] IN (470,477,479,481,483))   
    AND ([Response] = 'Yes, definitely') 
    AND ([ResponseDateKey] BETWEEN 20140601 AND 20150531) 
GROUP BY SurveyQuestionKey 
+0

你知道我的想法之前,我编辑它!但它通知“列'x.totals'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。”你能帮我纠正它吗? – JJJJ

相关问题