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;
【讨论】:
谢谢,这行得通。我想计算一下 DISTINCTCase
+YearsOld
这做得很好。以上是关于SELECT CASE SQL 中的 DISTINCT COUNT的主要内容,如果未能解决你的问题,请参考以下文章
SELECT 和 WHERE 中的 SQL CASE 用于选择行
SQL查询语句SELECT中带有case when嵌套子查询判断的问题