在列的一部分上应用 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 Male
和 2 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(它将计算集合中的所有非空项,而不是其中的变体)
请考虑这个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 Male
和 2 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(它将计算集合中的所有非空项,而不是其中的变体)