我需要找到记录多种性别的患者。 (我希望我知道如何创建一个表。)
[Hospital Number] [Sex Code]
0000001 M
0000002 F
0000003 M
0000003 F
在这里我们可以看到患者1和2都没问题,但患者3有多种性别。 (系统中有4种可用的性别)。
列为[Hospital Number]
和[Sex Code]
,表格称为Table1
。
答案 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