2014-11-03 89 views
0

的聚合我有一个2列的表,其中一个是1/0标志,表示他们是否已经打开电子邮件,第二个表示电子邮件地址(即[email protected])。SQL Server使用类似于

Opened   Email 
    0   [email protected] 
    1   [email protected] 
    ...    ... 

我试图找到如果用户名某些模式影响的打开率在LIKE使用正则表达式模式,但我不能确定的语法的匹配和不匹配该模式的行。

举例来说,我可以这样做:

SELECT Email, sum(Opened) 
FROM table1 
WHERE Email LIKE '%joe%' 

但这只是给了我匹配的行。我想要在相同的输出中执行和不匹配的行。

我希望得到的东西是这样的:

Pattern   Opened 
    'joe'   55 
    not_joe   15987 
    'sue'   78 
    not_sue   15964 
    ...    ... 

什么是做到这一点的最好方法是什么?

+0

你想在电子邮件的前三个字?什么是打开计数... 55,78这是不是在表 – 2014-11-03 17:31:13

+0

@Ganesh_Devlekar:模式会比抓住前3个字符更复杂。 55和78只是由#组成。他们会是COUNT() - 我认为是 - 生成的。 – screechOwl 2014-11-03 17:33:23

回答

1

如果我理解正确,你正在试图找出相似的用户名

您可以通过

SELECT 
    Email, 
    SOUNDEX(Email) 
FROM TableA 

SELECT COUNT(*) OpenedCount, 
     SOUNDEX(Email) EmailSOUNDEX 
FROM TableA 
GROUP BY SOUNDEX(Email) 
ORDER BY OpenedCount desc 

如果你想要的是类似的东西有起诉的所有电子邮件中使用的功能像SOUNDEX,以便将数在里面?

SELECT COUNT(*) OpenedCount, 
     SOUNDEX(Email) EmailSOUNDEX 
FROM TableA 
WHERE 
Email like '%Sue%' 
GROUP BY SOUNDEX(Email) 
ORDER BY OpenedCount desc 

对于这类搜索也许你可以建立相关的搜索术语词典以及与

SELECT COUNT(*) OpenedCount, 
     SearchTermTable.Term 
FROM TableA 
JOIN SearchTermTable ON 
    TableA.Email like '%'+SearchTermTable.Term+'%' 
WHERE 
GROUP BY SearchTermTable.Term 
ORDER BY OpenedCount desc 
1

加入它,如果你已经有了模式列表,就可以实现LIKE /不喜欢使用CROSS JOIN(警告:性能命中)。

查看下面的示例。注意:您可以在SELECT语句中改进LIKE的性能 - 有other options available

DECLARE @MatchList TABLE (ID INT, Pattern VARCHAR(3)) 
INSERT INTO @MatchList (ID, Pattern) VALUES (1, 'Joe') 
INSERT INTO @MatchList (ID, Pattern) VALUES (2, 'Sue') 


DECLARE @Table1 TABLE (Email VARCHAR(100)) 
INSERT INTO @Table1 (Email) VALUES ('[email protected]') 
INSERT INTO @Table1 (Email) VALUES ('[email protected]') 
INSERT INTO @Table1 (Email) VALUES ('[email protected]') 
INSERT INTO @Table1 (Email) VALUES ('[email protected]') 
INSERT INTO @Table1 (Email) VALUES ('[email protected]') 
INSERT INTO @Table1 (Email) VALUES ('[email protected]') 
INSERT INTO @Table1 (Email) VALUES ('[email protected]') 
INSERT INTO @Table1 (Email) VALUES ('[email protected]') 


SELECT 
    CASE WHEN Email LIKE '%'+Pattern+'%' THEN Pattern ELSE 'not_'+Pattern END AS Classification, 
    COUNT(*) Opened 
FROM 
    @MatchList m 
    CROSS JOIN 
    @Table1 
GROUP BY m.ID, CASE WHEN Email LIKE '%'+Pattern+'%' THEN Pattern ELSE 'not_'+Pattern END 
ORDER BY m.ID 
相关问题