SELECT CASE SQL中的DISTINCT COUNT

Ste*_*son 8 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`
Run Code Online (Sandbox Code Playgroud)

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

dav*_*tty 9

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

Count(distinct CASE when yearsold between 6 and 12 then case else null end)
Run Code Online (Sandbox Code Playgroud)

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

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


egg*_*yal 6

您可以使用子查询来过滤YearsOld每个案例的单个字段的人口统计表,尽管如果该案例可能与不同年龄的差异有关,ISR它最终只会被计入一个括号中(也许这就是您想要的?) :

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

或者,要“计算”每个括号内的每个“不同”“案例”,您可以按字面意思这样做:

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;
Run Code Online (Sandbox Code Playgroud)