使用" CASE" GROUP BY级别的命令

时间:2014-04-29 18:21:51

标签: mysql sql group-by case

我想获得5列,第1列是评估单位(EU),但在接下来的4列中,我想计算有多少家庭(不同的INSTANCE_ID_HOUSE)符合特定标准,但数据是由居民存储的。以下是我使用的4个查询(我基本上只想将它们组合成一个查询):

SELECT EU, COUNT( DISTINCT INSTANCE_ID_HOUSE ) FROM SENEGAL_CLEAN
WHERE CLUSTER_COMPLETE>0
GROUP BY EU
ORDER BY EU ASC

SELECT COUNT( DISTINCT INSTANCE_ID_HOUSE ) FROM SENEGAL_CLEAN
WHERE CLUSTER_COMPLETE>0 AND (W1_DRINK_SOURCE=1 OR W1_DRINK_SOURCE=4)
GROUP BY EU
ORDER BY EU ASC

SELECT COUNT( DISTINCT INSTANCE_ID_HOUSE ) FROM SENEGAL_CLEAN
WHERE CLUSTER_COMPLETE>0 AND (W2_GET_DRINK_WATER=1 OR W2_GET_DRINK_WATER=2)
GROUP BY EU
ORDER BY EU ASC

SELECT COUNT( DISTINCT INSTANCE_ID_HOUSE ) FROM SENEGAL_CLEAN
WHERE CLUSTER_COMPLETE>0 AND (S2_SEE_LATRINE=1 OR S2_SEE_LATRINE=2)
GROUP BY EU
ORDER BY EU ASC

2 个答案:

答案 0 :(得分:2)

您可以使用案例陈述来计算:

    select
    eu,
    count (distinct case when cluster_complete > 0 then instance_id_house else null end) as YourAliasHere,
    count (distinct when cluster_complete > 0 and (W1_DRINK_SOURCE=1 OR W1_DRINK_SOURCE=4) then instance_id_house else null end) as YourNextAlias\
    ...
FROM SENEGAL_CLEAN
group by EU

因此,您将计算每个case_id_house,它们与每个case语句中的条件相匹配。我想你可以把你的where子句留下来(根据你当前正在展示的内容)。

答案 1 :(得分:0)

尝试这样的事情:

Select S.EU,t1.c1 , t2.c2, t3.c3, t4.c4 
From SENEGAL_CLEAN S
inner join(

SELECT EU, COUNT( DISTINCT INSTANCE_ID_HOUSE ) c1 FROM SENEGAL_CLEAN
WHERE CLUSTER_COMPLETE>0
GROUP BY EU
)t1 on t1.Eu= s.Eu

inner join(
SELECT EU,COUNT( DISTINCT INSTANCE_ID_HOUSE ) c2 FROM SENEGAL_CLEAN
WHERE CLUSTER_COMPLETE>0 AND (W1_DRINK_SOURCE=1 OR W1_DRINK_SOURCE=4)
GROUP BY EU
)t2 on t2.Eu= s.Eu

inner join(
SELECT Eu,COUNT( DISTINCT INSTANCE_ID_HOUSE ) c3 FROM SENEGAL_CLEAN
WHERE CLUSTER_COMPLETE>0 AND (W2_GET_DRINK_WATER=1 OR W2_GET_DRINK_WATER=2)
GROUP BY EU
)t3 on t3.Eu= s.Eu

inner join(
SELECT Eu,COUNT( DISTINCT INSTANCE_ID_HOUSE ) c4 FROM SENEGAL_CLEAN
WHERE CLUSTER_COMPLETE>0 AND (S2_SEE_LATRINE=1 OR S2_SEE_LATRINE=2)
GROUP BY EU
)t4 on t4.Eu = s.Eu

SqlFiddle:http://sqlfiddle.com/#!9/90b33/1