2012-08-07 46 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