2014-11-03 2 views
0

У меня есть таблица с 2 столбцами, одна является флагом 1/0 для того, открыли ли они электронное письмо, второе - адрес электронной почты (т.е. [email protected]).SQL Server Aggregate, используя как

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

Вы хотите 1-ый три символа по электронной почте? что такое Opened Count ... 55,78 это не в таблице –

+0

@Ganesh_Devlekar: шаблоны были бы более сложными, чем просто захват первых трех символов. 55 и 78 просто составлены #. Я предполагаю, что они будут COUNT(). – screechOwl

ответ

1

Если я правильно понял, вы пытаетесь определить подобные имена пользователей

вы можете использовать функцию как SOUNDEX группировать счета по

SELECT 
    Email, 
    SOUNDEX(Email) 
FROM TableA 

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

Если все, что вы хотите что-то вроде все письма, которые посудить в этом?

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 (предупреждение: удар производительности).

См. Ниже пример. Примечание: вы можете повысить производительность LIKE в инструкции SELECT - есть 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 
Смежные вопросы