代码之家  ›  专栏  ›  技术社区  ›  DooDoo

将Group By应用于列的一部分并获取矛盾

  •  3
  • DooDoo  · 技术社区  · 7 年前

    请考虑此表:

    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 回复  |  直到 7 年前
        1
  •  2
  •   DhruvJoshi    7 年前

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

    然后从名称中找到名字

    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
    
        2
  •  2
  •   Caius Jard    7 年前

    将所有内容子串到第一个空格作为名字。将姓名分组,并将其减少到具有多个不同性别的姓名:

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

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