2012-08-07 91 views
0

我有三條精選語句,除了每個事件的平均「分數」和每個事件的計數之外,還提供了出席特定事件(醫療保健,宗教和運動)的成員數量。梳理精選語句

每個事件的計數都不相同。

單獨的每個查詢都有效,但我想將它們組合成一個查詢。

我該怎麼做?

(select sum(case when Healthcare ='1' then 1 else 0 end) as [Healthcare_never], 
sum(case when Healthcare ='2' then 1 else 0 end) as [Healthcare_not often], 
sum(case when Healthcare ='3' then 1 else 0 end) as [Healthcare_average], 
sum(case when Healthcare ='4' then 1 else 0 end) as [Healthcare_often], 
sum(case when Healthcare ='5' then 1 else 0 end) as [Healthcare_very often] 
,avg(Cast(Healthcare as float)) as Average 
,count(Healthcare) as N_Healthcare 
from Member 
where Healthcare > '0') 


(select 
    sum(case when Religious ='1' then 1 else 0 end) as [Religious_never], 
    sum(case when Religious ='2' then 1 else 0 end) as [Religious_not often], 
    sum(case when Religious ='3' then 1 else 0 end) as [Religious_average], 
    sum(case when Religious ='4' then 1 else 0 end) as [Religious_often], 
    sum(case when Religious ='5' then 1 else 0 end) as [Religious_very often], 
    Avg(cast(Religious as float)) as Average 
    ,count(Religious) as N_Religious 
    from Member 
    where Religious > '0') 


(select 
sum(case when Sport ='1' then 1 else 0 end) as [Sport_never], 
sum(case when Sport ='2' then 1 else 0 end) as [Sport_not often], 
sum(case when Sport ='3' then 1 else 0 end) as [Sport_average], 
sum(case when Sport ='4' then 1 else 0 end) as [Sport_often], 
sum(case when Sport ='5' then 1 else 0 end) as [Sport_very often], 
Avg(cast(Sport as float)) as Average 
,count(Sport) as N_Sport 
from Member 
where Sport > '0') 
+0

你想吃點什麼列從合併查詢來獲取? – complex857 2012-08-07 20:01:26

+0

你的目標是什麼?你試過什麼了? – gcochard 2012-08-07 20:01:34

+0

我的目標是爲每個列和適當的計數設置一個值。我遇到的問題是在Where聲明中......我將發佈我在下面嘗試的內容。 – Stan 2012-08-07 20:08:07

回答

3

嘗試所有的SELECT語句之間的這種

select 
sum(case when Healthcare ='1' then 1 else 0 end) as [Healthcare_never], 
sum(case when Healthcare ='2' then 1 else 0 end) as [Healthcare_not often], 
sum(case when Healthcare ='3' then 1 else 0 end) as [Healthcare_average], 
sum(case when Healthcare ='4' then 1 else 0 end) as [Healthcare_often], 
sum(case when Healthcare ='5' then 1 else 0 end) as [Healthcare_very often], 
avg(Cast((case when Healthcare > 0 Then Healthcare Else Null end) as float)) as Healthcare_Average, 
count(case when Healthcare > 0 Then Healthcare Else Null end) as N_Healthcare, 

sum(case when Religious ='1' then 1 else 0 end) as [Religious_never], 
sum(case when Religious ='2' then 1 else 0 end) as [Religious_not often], 
sum(case when Religious ='3' then 1 else 0 end) as [Religious_average], 
sum(case when Religious ='4' then 1 else 0 end) as [Religious_often], 
sum(case when Religious ='5' then 1 else 0 end) as [Religious_very often], 
Avg(cast((case when Religious > 0 Then Religious Else Null end) as float)) as Religious_Average, 
count(case when Religious > 0 Then Religious Else Null end) as N_Religious, 

sum(case when Sport ='1' then 1 else 0 end) as [Sport_never], 
sum(case when Sport ='2' then 1 else 0 end) as [Sport_not often], 
sum(case when Sport ='3' then 1 else 0 end) as [Sport_average], 
sum(case when Sport ='4' then 1 else 0 end) as [Sport_often], 
sum(case when Sport ='5' then 1 else 0 end) as [Sport_very often], 
Avg(cast((case when Sport > 0 Then Sport Else Null end) as float)) as Sport_Average, 
count(case when Sport > 0 Then Sport Else Null end) as N_Sport 

from Member 
2

只要把UNION。但是您可能需要添加另一列來指示它來自哪個表。列標題必須相同。例如:

select 'Healthcare' as source 
, sum(case when Healthcare ='1' then 1 else 0 end) as [never], 
sum(case when Healthcare ='2' then 1 else 0 end) as [not often], 
sum(case when Healthcare ='3' then 1 else 0 end) as [average], 
sum(case when Healthcare ='4' then 1 else 0 end) as [often], 
sum(case when Healthcare ='5' then 1 else 0 end) as [very often] 
,avg(Cast(Healthcare as float)) as Average 
,count(Healthcare) as N_Healthcare 
from Member 
where Healthcare > '0' 
UNION ALL 

+0

列標題不需要相同。列名取自第一個子查詢,後續子查詢中的名稱將被忽略。 – 2012-08-07 20:25:02

1

的問題是其中的語句爲每個事件的不正確計數。 醫療保健數應該是54,54體育等13 代替所有的數量是55

select 
sum(case when Healthcare ='1' then 1 else 0 end) as [Healthcare_never], 
sum(case when Healthcare ='2' then 1 else 0 end) as [Healthcare_not often], 
sum(case when Healthcare ='3' then 1 else 0 end) as [Healthcare_average], 
sum(case when Healthcare ='4' then 1 else 0 end) as [Healthcare_often], 
sum(case when Healthcare ='5' then 1 else 0 end) as [Healthcare_very often], 
avg(Cast(Healthcare as float)) as Average, 
count(Healthcare) as N_Healthcare, 

sum(case when Religious ='1' then 1 else 0 end) as [Religious_never], 
sum(case when Religious ='2' then 1 else 0 end) as [Religious_not often], 
sum(case when Religious ='3' then 1 else 0 end) as [Religious_average], 
sum(case when Religious ='4' then 1 else 0 end) as [Religious_often], 
sum(case when Religious ='5' then 1 else 0 end) as [Religious_very often], 
Avg(cast(Religious as float)) as Average, 
count(Religious) as N_Religious, 

sum(case when Sport ='1' then 1 else 0 end) as [Sport_never], 
sum(case when Sport ='2' then 1 else 0 end) as [Sport_not often], 
sum(case when Sport ='3' then 1 else 0 end) as [Sport_average], 
sum(case when Sport ='4' then 1 else 0 end) as [Sport_often], 
sum(case when Sport ='5' then 1 else 0 end) as [Sport_very often], 
Avg(cast(Sport as float)) as Average, 
count(Sport) as N_Sport 
from contacts_cstm 
where Sport > '0' or Religious > '0' or Healthcare >'0' 
+0

當你使用上面的'OR'條件時,這不會返回正確的數據。 – 2012-08-07 20:31:04

+0

你是對的,它不會返回正確的數據。你之前的例子沒有。謝謝! – Stan 2012-08-07 20:43:04