2015-07-21 52 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

相關問題