在列的一部分上应用 group by 并得到矛盾

Apply group by on part of a column and get contradictions

请考虑这个Table:

Id           FullName           Gender
---------------------------------------
1            Tom Hanksi Junior     1
2            Tom Cruisi            2
3            Meril Strippi         2
4            Leo  Dicaprioi        1
5            Robert Deniroi        1
6            Al Pcinoi             1
7            Chanrilize theroni    2
8            Robert Green          1
9            Nicole Kidmani        2
10           Nicole Wagner         2
11           Peter Pan Green       1
12           Peter Viera           1
13           Peter J. Dark         2
14           Tom Henry             1

性别值为:1 for Male2 for Female

现在我想为名字和性别创建一个Table(假设每个名字都应该有一个对应的性别)。

Name       Gender
-----------------
Tom         1
Meril       2
Leo         1
Rebert      1
Al          1
Charlize    2
Nicole      2
Peter       1

1)如何只在全名和性别的姓名部分申请GROUP BY

2)如何得到名字和性别的矛盾。例如,对于 Tom,我们有男性和女性值。

谢谢

我在这里做的一个错误假设是名字是名称中第一个 space 之前的部分。

然后从名字中找到第一个名字作为

select left(Name, charindex(' ',Name)-1)

你可以根据这个和性别分组

select 
Name=left(Name, charindex(' ',Name)-1),Gender
from
yourTableName
group by
left(Name, charindex(' ',Name)-1),Gender
order by left(Name, charindex(' ',Name)-1),Gender

要查找具有两种性别且同名的人,您可以使用

select 
     Name=left(Name, charindex(' ',Name)-1)
from
     yourTableName
group by
     left(Name, charindex(' ',Name)-1)
having count(distinct gender)>1

如果您想同时使用两者,可能在您想要丢弃具有两个性别关联的姓名的情况下,您可以执行如下操作

; with NnG as 
(
select 
Name=left(Name, charindex(' ',Name)-1),Gender
from
yourTableName
group by
left(Name, charindex(' ',Name)-1),Gender
),
N2G as 
(
select 
     Name=left(Name, charindex(' ',Name)-1)
from
     yourTableName
group by
     left(Name, charindex(' ',Name)-1)
having count(distinct gender)>1
)

select * from nng left join n2g 
on nng.Name=N2G.name 
where n2g.name is null

将第一个 space 之前的所有内容作为名字进行子字符串化。对名字进行分组并减少到那些具有不止一种不同性别的名字:

SELECT
  SUBSTRING(Name, 1, charindex(' ',Name)-1), Gender
FROM
  table
GROUP BY
  SUBSTRING(Name, 1, charindex(' ',Name)-1)
HAVING
  COUNT(DISTINCT gender) > 1

如果你有 1000 名男性,则将不同性别计数为 return1,因为集合中只有一种性别(男性)。如果你有 1000 名男性和 200 名女性,计算不同的性别将 return 2 因为集合中有 2 种性别(男性和女性)。如果您要省略 DISTINCT 关键字,那么 count() 将 return 第一个示例为 1000,第二个示例为 1200(它将计算集合中的所有非空项,而不是其中的变体)