SELECT CASE SQL 中的 DISTINCT COUNT

Posted

技术标签:

【中文标题】SELECT CASE SQL 中的 DISTINCT COUNT【英文标题】:DISTINCT COUNT in SELECT CASE SQL 【发布时间】:2012-05-10 23:57:39 【问题描述】:

我有一个报告表,其中包含 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

【问题讨论】:

总是有可能的,但如果一个病例跨越一个 5-6 岁的人怎么办。您希望计数在案例开始的范围内,还是在此人通过最近活动关联的案例范围内。 Case 可以为不同的ISR 设置不同的YearsOld 年龄吗? 是的。 ISR 是关于药物不良反应的个人安全报告。对于特定事件(由两名或多名报告人提交),可以有多个 ISR,并且对于在不同日期发生在他/她身上的同一不良事件案例,可以有多个 ISR。理想情况下,Case+DateOfEvent+YearsOld 将用于计算在给定年龄的情况下发生的不良事件的确切数量,但报告中经常省略事件日期,因此 Case+YearsOld 尽可能接近计算独特的案例+不良事件。您的以下解决方案效果很好。 【参考方案1】:

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

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

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

只是关于列命名的注释,如果您可以选择,我建议不要使用在 SQL 中有意义的词(即使用“case_num”而不是 case)。

【讨论】:

谢谢,我同意你的意见; Case 是现有表中的字段名。【参考方案2】:

您可以使用子查询来过滤每个案例的单个 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;

【讨论】:

谢谢,这行得通。我想计算一下 DISTINCT Case+YearsOld 这做得很好。

以上是关于SELECT CASE SQL 中的 DISTINCT COUNT的主要内容,如果未能解决你的问题,请参考以下文章

SELECT 和 WHERE 中的 SQL CASE 用于选择行

SQL查询语句SELECT中带有case when嵌套子查询判断的问题

图解 SQL 执行顺序,通俗易懂!

select case when if 的一些用法

WHERE子句中的SQL Server CASE表达式以检查NULL值

SQL SELECT、CASE、BETWEEN INTO 语句