#sql #sql-server
#sql #sql-сервер
Вопрос:
Я пытаюсь получить доменное имя для всех адресов электронной почты, используя строковую функцию substring() и charindex(), а затем сгруппировать его и подсчитать количество электронных писем с тем же доменным именем.
Мой запрос:
declare @SearchTerm nvarchar(1) = '@'
select substring(Email, charindex(@SearchTerm, Email) 1, len(Email)) as [Email Domain],
count(Email) as Total
from tblResident
group by substring(Email, charindex(@SearchTerm, Email) 1, len(Email))
Но, как вы можете видеть, оператор, используемый в предложении «group by», совпадает с тем, который я использовал в инструкции «select». Это довольно долго, и я не хочу записывать его дважды. Итак, мне просто интересно, есть ли способ, которым я могу написать substring(Email, charindex(@SearchTerm, Email) 1, len(Email))
только один раз, но при этом добиться того же результата?
Моя таблица:
Результат:
Комментарии:
1. Даже если оно длинное, но оно не является неправильным…. вы можете полностью написать это.
Ответ №1:
-- prepare data
use tempdb
drop table dbo.tblResident;
create table dbo.tblResident (id int identity, name varchar(30), Email varchar(30));
go
insert into dbo.tblResident (name, email)
values ('Justin', 'J@J.COM'), ('Nancy', 'N@N.COM'), ('Evee', 'E@E.com'), ('Coco', 'C@C.com'), ('Jess', 'J@J.com');
go
-- here is the query
;with c as (
select substring(Email, charindex(@SearchTerm, Email) 1, len(Email)) as [Email Domain]
from tblResident )
select [Email Domain], Total=count(*)
from c
group by [Email Domain];
Комментарии:
1. Да, вам не нужно писать длинную подстроку (Email, charindex(@searchTerm, Email) 1, len (Email)) дважды.
2. Согласен, но это будет не лучше, чем @Tony Stark. Конечно, он достигнет того, чего он хочет, но с любой другой точки зрения то, что он уже сделал, лучше.
Ответ №2:
WITH t AS ( SELECT SUBSTRING(email,3,LEN(email)) AS emaildomain
FROM tblresident )
SELECT emaildomain,COUNT(*)
FROM t
GROUP BY emaildomain;
Комментарии:
1. Я не верю, что это разрешено в SQL Server.
2. Я просто хочу сказать то же самое, что и упомянутый здесь @siride. Это просто не работает (в SQL Server), и я не знаю, почему люди голосуют за это.
3. @Teja, я не думаю, что вы тестируете свой скрипт, прежде чем публиковать его здесь. Даже после изменения исходного сценария это все равно не работает, потому что нет функции LENGTH() (в sql server)
Ответ №3:
Прежде всего, если вы хотите J.com один раз для обоих J@J.com и K@J.com ; означает, что вы должны выполнить group by с выражением, тогда то, что вы сделали, является лучшим способом.
С другой стороны, если вы хотите J.com дважды из J@J.com и K@J.com тогда вы могли бы сделать следующее;
SELECT substring(Email, charindex(@SearchTerm, Email) 1, len(Email)) as [Email Domain],
COUNT(Email) as Total
FROM tblResident
GROUP BY Email
Комментарии:
1. Но они группируются по выражению, которое будет иметь результат, отличный от самого столбца.
2. @stride, я понимаю ваш комментарий. Но это удовлетворит образцу данных. Если необходимо СГРУППИРОВАТЬ с помощью expression, с этим ничего не поделаешь. Я не понимаю, почему голосовать против!!!!
3. И все же можно использовать обычное табличное выражение или вложенные запросы, но это будет не лучше, чем сейчас.
4. примеры данных могут не иллюстрировать каждый аспект фактических данных. Понятно, что OP хочет сгруппировать по части адреса электронной почты после ключевого слова. Почему они хотят это сделать, я не знаю, но они это делают. Мы должны это уважать.
5. Они буквально спрашивают об этом. Они хотят группировать по доменному имени адреса электронной почты, который может быть получен только с помощью выражения.