满足条件时的GROUP行

时间:2016-04-16 22:38:04

标签: mysql sql group-by

我希望你能帮我解决下一个问题。我试图找出在某些条件发生时如何计算许多记录。

我的输入示例如下所示:

fullname    emailaddress1   telephone1 
Juana Foster    juana   
Juana Foster    juana       1933595322
Henzley                     1841901633
Henzley         henzley     1841901633
Hoyle           hoyle       1584190699
Hoyle           hoyle       1584190655
Aaron Jeans     alpha2222   1816808600
Aaron Jeans     alpha       1816808600
Erick Martin    a1009       1816250211
Erick Martin    martin      1565960141
Erick Martin    a1009   
Erick Martin    martin      1565960141

我想将与下一个条件匹配的事件分组:  Fullname = Fullname and ((emailaddress = emailaddress and emailaddress != '') OR (telephone=telephone and telephone != ''))。 换句话说,我想在一行中分组,所有行具有相同的全名和相同的电子邮件或地址。电子邮件和地址必须清空才能被视为可匹配。

预期输出为:

fullname     occurrences
Juana Foster  1
Henzley       1
Hoyle         1
Aaron Jeans   1
Erick Martin  2

我在循环中解决问题没有任何问题,但我一直在思考如何在SQL中解决问题,并尝试了GROUP BY和UNIONS,但是我还没有达到解决方案。我正在使用mySQL。

更新 我提供了一个更具体案例的新例子,以澄清信息: 例如,下一个输入 fullname emailaddress1 telephone1 Aaron Jeans alpha2222 1816808600 Aaron Jeans 1816808600 Aaron Jeans alpha2222 1816808600 Aaron Jeans alpha 1816808600 Erick Martin a1009 1816250211 Erick Martin a1009 Erick Martin 1816250211 Erick Martin martin 1565960141
Erick Martin martin 1565960141 Nacho Mason 1111111111 Nacho Mason 2222222222

在这种情况下,输出应为: Aaron Jeans 1 Erick Martin 2 Nacho Mason 2

Aaron Jeans有一次出现,因为他的4个唱片共享同一部电话。

Erick Martin有两次出现,第一次出现在下一个案例中:

Erick Martin a1009 1816250211 Erick Martin a1009 Erick Martin 1816250211

由于3条记录共享相同的全名和(相同的电子邮件(a1009)或同一部电话(1816250211)),因此这3条记录被认为是1次。 Erick Martin的第二次出现与下两个记录匹配,因为它具有相同的全名,相同的电子邮件和相同的电话。

Erick Martin martin 1565960141
Erick Martin martin 1565960141

Nacho Mason有2次出现,因为他有2部不同的手机,而且他的电子邮件是空的,并且不能被认为是平等的。

1 个答案:

答案 0 :(得分:0)

我认为这可能是你想要做的事情。 首先,您要对电子邮件不为空白且电话不是空白的所有事件进行选择,如

SELECT fullname,emailaddress1,telephone1,COUNT(*) AS occurrences
  FROM T
  WHERE emailaddress1 != ''
    AND telephone1 != ''
  GROUP BY fullname,emailaddress1,telephone1

然后现在你外部SELECT和MAX(出现)GROUP BY fullname

SELECT fullname, MAX(occurrences) as occurrences
FROM
(SELECT fullname,emailaddress1,telephone1,COUNT(*) AS occurrences
  FROM T
  WHERE emailaddress1 != ''
    AND telephone1 != ''
  GROUP BY fullname,emailaddress1,telephone1
)AS result
GROUP BY fullname

sqlfiddle 至少,我认为这是你想要达到的目标。

但是很奇怪,如果你有另一个全名,包含3行相同的电子邮件和电话号码,以及相同的全名,另外两行相同的电子邮件和电话号码,如果这样

Adam Smith   adam  1234
Adam Smith   adam  1234
Adam Smith   adam  1234
Adam Smith   smith 5678
Adam Smith   smith 5678

你想表现为亚当史密斯3或亚当史密斯2或两者? 亚当史密斯3上面的查询

更新:我想根据你想要的输出你想要亚当史密斯3,因为你的Erick Martin 2,他将会选择Erick Martin 1,Erick Martin 2。