Sql 寻找多性别患者

Sql 寻找多性别患者,sql,ms-access,Sql,Ms Access,我需要找到有多性别记录的病人。(我希望我知道如何创建表。) 在这里,我们可以看到患者1和2是正常的,但患者3有多种性别。(系统中有4个可用的性别) 列是[医院编号]和[性别代码],该表称为表1,而在标准SQL中,您只需使用一个分组查询和一个计数(不同),如下所示: SELECT [hospital number] FROM patients GROUP BY [hospital number] HAVING COUNT(DISTINCT [Sex Code])>1 如果您使用的是Micr

我需要找到有多性别记录的病人。(我希望我知道如何创建表。)

在这里,我们可以看到患者1和2是正常的,但患者3有多种性别。(系统中有4个可用的性别)


列是
[医院编号]
[性别代码]
,该表称为
表1

,而在标准SQL中,您只需使用一个分组查询和一个计数(不同),如下所示:

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 distinct查询将只计算非null值)

您可能想使用

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

COUNT([hospital number])>1

在标准SQL中,您只需使用GROUP BY查询和计数(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 distinct查询将只计算非null值)

您可能想使用

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

COUNT([hospital number])>1

替代解决方案,执行自连接:

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]
选择不同的p1。[医院编号]
从患者身上提取p1
内部连接患者作为p2
p1上【医院编号】=p2【医院编号】
p1.[性别代码]p2.[性别代码]
如果找到相同的
[医院号码]
但不同的
[性别代码]
,则返回
[医院号码]


现在根据HarveyFrench的建议编辑

替代解决方案,执行自连接:

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]
选择不同的p1。[医院编号]
从患者身上提取p1
内部连接患者作为p2
p1上【医院编号】=p2【医院编号】
p1.[性别代码]p2.[性别代码]
如果找到相同的
[医院号码]
但不同的
[性别代码]
,则返回
[医院号码]


现在根据HarveyFrench的建议编辑

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

SELECT [hospital number]
FROM patients
GROUP BY [hospital number]
HAVING MIN([Sex Code]) <> MAX([Sex Code]);
选择[医院编号]
来自患者
分组依据[医院编号]
最小值([性别代码])最大值([性别代码]);

这也应该比count distinct具有更好的性能。它不会返回
[Sex code]
NULL
且具有另一个值的行(也不会
计数(不同)
。即忽略
NULL
。这很容易修复,但不清楚如何处理
NULL

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

SELECT [hospital number]
FROM patients
GROUP BY [hospital number]
HAVING MIN([Sex Code]) <> MAX([Sex Code]);
选择[医院编号]
来自患者
分组依据[医院编号]
最小值([性别代码])最大值([性别代码]);
这也应该比count distinct具有更好的性能。它不会返回
[Sex code]
NULL
且具有另一个值的行(也不会返回
count(distinct)
。也就是说,
NULL
被忽略。这很容易修复,但不清楚如何处理
NULL

,甚至更简单

SELECT [hospital number]
  FROM patients
GROUP BY [hospital number]
HAVING COUNT(*)>1
甚至更简单

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

您尝试过什么吗?每日提示:分组方式与计数方式(不同)!MS SQL:从表1中选择医院编号分组方式医院编号计数方式(性别代码)>1.您需要将此查询转换为ms access语法。注意:您的问题意味着每家医院只能有两名患者:一名男性和一名女性。@joop,我想[医院编号]是指患者id。您尝试过什么吗?每日提示:分组方式与计数方式相结合(不同)!MS SQL:按计数(性别代码)>1的医院编号从表1组中选择医院编号。您需要将此查询转换为MS access语法。注意:您的问题意味着每家医院只能有两名患者:一名男性和一名女性。@joop,我想是[医院编号]表示患者id。感谢您的建议和评论。我确实尝试了一些方法,但它们不起作用,因此我不想在帖子中添加不必要的评论。干得好,fthiella,如果我有足够的声誉,我会在答案上加一。SQL是通用的(Oracle、MS Access等),我想您的意思是“在SQL Server中…”,这与MS Access问题无关:)@Fionnuala是的,它与问题本身无关,但我的意思是:对于MS Access,使用子查询(或像Gordon的答案一样使用min/max),但如果您的dbms支持count distinct,则最好使用count distinct-还需要注意的是,使用count(*)的子查询将以不同于计数的方式处理空值。感谢您的建议和评论。我确实尝试了一些方法,但它们不起作用,因此我不想在帖子中添加不必要的评论。干得好,fthiella,如果我有足够的声誉,我会用加号标记答案。SQL是通用的(Oracle、MS Access等)我想你的意思是“在SQL Server中…”,这与MS Access问题无关:)@Fionnuala是的,它与问题本身无关,但我的意思是:对于MS Access,使用子查询(或像Gordon的答案那样的最小/最大),但如果您的dbms支持count distinct,更好地使用count distinct-还需要注意的是,count(*)的子查询处理空值的方式与count distinct的查询不同@jarlh'从表1 p1中选择distinct[Hospital Number]在p1上连接表1 p2。[Hospital Number]=p2。[Hospital Number]和p1[