2016-03-04 116 views
1

我有一个简单的查询,如下所示:SQL Server中,重复的子查询和别名

Select SUBSTRING(Email, Charindex('@', Email) + 1, 
    Len(Email) - CharIndex('@', Email)) as EmailDomain, 
    Count(Email) as Total 
from tblPerson 
Group by SUBSTRING(Email, Charindex('@', Email) + 1, 
Len(Email) - CharIndex('@', Email)) 

这是除了有一个子查询重复做工精细:

SUBSTRING(Email, Charindex('@', Email) + 1, 
Len(Email) - CharIndex('@', Email)) 

我已经把一个别名子查询有as EmailDomain,但是当我查询是这样的:

Select SUBSTRING(Email, Charindex('@', Email) + 1, 
    Len(Email) - CharIndex('@', Email)) as EmailDomain, 
    Count(Email) as Total 
from tblPerson 
Group by EmailDomain 

我得到了一个错误:

Invalid column name 'EmailDomain'

如何解决此问题,但同时也不使用重复查询?

+0

这是因为你'select'声明你的'组by'条款后面解析。所以如果你在'select'查询中使用别名,它不会被'group by'识别。您之前提供的主要查询是查询它的最佳方法,而不是使用子查询。 – Utsav

+0

@Utsav啊,谢谢。我想我明白了... – Ian

回答

1

答案很简单,您不能在WHERE子句或GROUP BY子句中使用列别名。

你可以尝试这样的:

SELECT EmailDomain, 
     Total 
FROM (
     Select SUBSTRING(Email, Charindex('@', Email) + 1, 
     Len(Email) - CharIndex('@', Email)) as EmailDomain, 
     Count(Email) as Total 
     from tblPerson 
     ) a 
Group by EmailDomain 
+1

感谢您的回答,我明白了... – Ian

+0

@Ian: - 不客气! –

1

GROUP BY不能使用别名。为了解决这个问题,你可以使用子查询:

SELECT 
    t.EmailDomain, 
    COUNT(t.Email) AS Total 
FROM (
    SELECT 
     SUBSTRING(Email, CHARINDEX('@', Email) + 1, LEN(Email) - CHARINDEX('@', Email)) AS EmailDomain, 
     Email 
    FROM tblPerson 
) t 
GROUP BY t.EmailDomain 
+0

啊,谢谢我明白了,子查询必须这样做。谢谢! – Ian

0

下面SCRIPT TRY:

Select EmailDomain from (Select SUBSTRING(Email, Charindex('@', Email) + 1, 
    Len(Email) - CharIndex('@', Email)) as EmailDomain, 
    Count(Email) as Total 
from tblPerson) tperson 
Group by EmailDomain