2016-03-04 30 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