SELECT CASE SQL中的DISTINCT COUNT

时间:2012-05-01 13:04:40

标签: mysql select if-statement case

我有一份报告表,其中包含字段Case(唯一编号),ISR(个人安全报告 - 唯一编号)和YearsOld

每个案例可以有多个ISR。我想计算年龄组中唯一病例的数量。

这个SQL给了我一个ISR数量的计数:

SELECT  
COUNT(CASE WHEN `YearsOld` = -2) THEN 1 END) `No Report`,
COUNT(CASE WHEN `YearsOld` BETWEEN 0 AND 5) THEN 1 END) `0 to 5`
COUNT(CASE WHEN `YearsOld` BETWEEN 6 AND 12) THEN 1 END) `6 to 12`
FROM `Demographics`

有没有办法修改这个以计算这些年龄组的DISTINCT Cases

2 个答案:

答案 0 :(得分:9)

如果您的“case”变量是唯一的,您当然可以直接将distinct关键字放在SQL CASE语法中:

Count(distinct CASE when yearsold between 6 and 12 then case else null end)

这样,case变量的每个唯一值只计算一次。

只是关于列命名的说明,如果你有选择的话,我建议不要使用在SQL中有意义的单词(即使用'case_num'代替case)。

答案 1 :(得分:4)

您可以使用子查询来过滤每个案例中单个YearsOld字段的人口统计信息表格,但如果该案例可能与不同ISR的差异年龄相关,那么它最终只会计算在一个括号中(也许这就是你想要的?):

SELECT
  ... -- as you currently have
FROM (
  SELECT `Case`, `YearsOld` from `Demographics` GROUP BY `Case`
) t;

或者,为了“计算”每个括号内的每个“不同”“案例”,你的字面意思是:

SELECT
  COUNT(DISTINCT CASE WHEN `YearsOld` = -2 THEN 1 END) `No Report`,
  COUNT(DISTINCT CASE WHEN `YearsOld` BETWEEN 0 AND  5 THEN `Case` END) `0 to 5`,
  COUNT(DISTINCT CASE WHEN `YearsOld` BETWEEN 6 AND 12 THEN `Case` END) `6 to 12`
FROM Demographics;