Примените group by к части столбца и получите противоречия - PullRequest
0 голосов
/ 26 ноября 2018

Пожалуйста, рассмотрите эту таблицу:

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.

Теперь я хочу создать таблицу для имен и полов (предполагается, чтокаждое имя должно иметь один соответствующий пол).

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

1) Как я могу применить GROUP BY к только имени части полного имени и пола?

2) Как я могу получить противоречия имен и полов.Например, для Tom у нас есть мужские и женские значения.

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Подстрока все до первого пробела в качестве имени.Сгруппируйте по имени и сократите до тех имен, которые имеют количество более чем одного отдельного пола:

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

Если у вас 1000 мужчин, подсчет различного пола вернет 1, потому что в наборе есть только один пол.(мужчина).Если у вас 1000 мужчин и 200 женщин, подсчет различного пола вернет 2, потому что в наборе есть 2 вида пола (мужской и женский).Если вы опустите ключевое слово DISTINCT, то count () вернет 1000 для первого примера и 1200 для второго (он будет считать все ненулевые элементы в наборе, а не их вариации)

0 голосов
/ 26 ноября 2018

Я предпочитаю неверное предположение, что первое имя - это часть имени перед первым пробелом.

, тогда первое имя определяется по имени как

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
...