找到多性别的患者

时间:2015-10-06 09:45:13

标签: sql ms-access

我需要找到记录多种性别的患者。 (我希望我知道如何创建一个表。)

[Hospital Number] [Sex Code]

0000001           M
0000002           F
0000003           M
0000003           F

在这里我们可以看到患者1和2都没问题,但患者3有多种性别。 (系统中有4种可用的性别)。

列为[Hospital Number][Sex Code],表格称为Table1

4 个答案:

答案 0 :(得分:4)

MS Access中不需要子查询。您可以只比较最小值和最大值:

SELECT [hospital number]
FROM patients
GROUP BY [hospital number]
HAVING MIN([Sex Code]) <> MAX([Sex Code]);

这也应该具有比计数明显更好的性能。它不会返回[Sex Code]NULL 会占用另一个值的行(COUNT(DISTINCT)也不会。NULL被忽略。很容易解决,但目前还不清楚你想如何处理NULL

答案 1 :(得分:3)

在标准SQL中,您只需使用GROUP BY查询和COUNT(DISTINCT),如下所示:

SELECT [hospital number]
FROM patients
GROUP BY [hospital number]
HAVING COUNT(DISTINCT [Sex Code])>1

如果您使用的是Microsoft Access,则需要使用其他解决方案,因为未提供COUNT DISTINCT。有多种方法可以解决您的问题,其中一种方法是使用子查询:

SELECT [hospital name]
FROM (
  SELECT DISTINCT [hospital name], [Sex code]
  FROM Patients
) AS s
GROUP BY [hospital name]
HAVING COUNT(*)>1

请注意,带有count(*)的子查询将包含具有“null”性别的患者(而计数不同的查询将仅计算非空值)。

您可能想要使用

COUNT(*)>1

返回所有具有多种性别(以及无效和非空性别)的患者。如果您只想忽略空值,可以使用:

COUNT([hospital number])>1

答案 2 :(得分:2)

替代解决方案,自我加入:

select distinct p1.[hospital number]
FROM patients AS p1
INNER JOIN patients AS p2
  ON  p1.[hospital number] = p2.[hospital number]
  AND p1.[Sex code] <> p2.[Sex code]

如果[hospital number]相同,则会返回[hospital number],但会找到不同的[Sex code]

现在根据HarveyFrench的建议进行编辑!

答案 3 :(得分:1)

甚至更简单。

SELECT [hospital number]
  FROM patients
GROUP BY [hospital number]
HAVING COUNT(*)>1