Sql server 如何按别名分组

Sql server 如何按别名分组,sql-server,Sql Server,我试图找出我们每个员工计划教授的课程数量,我计算了他们在时间表中出现的次数,如果我只使用员工的名字,它会运行得很好,但无论出于什么原因,当我尝试连接他们的名字和姓氏,并按指定的别名分组时,它都不起作用。我做错了什么 SELECT DISTINCT sf.StfFirstName + ' ' + sf.StfLastname As StaffName, COUNT(fc.StaffID) FROM Staff sf JOIN Faculty_Classes fc ON sf.StaffID =

我试图找出我们每个员工计划教授的课程数量,我计算了他们在时间表中出现的次数,如果我只使用员工的名字,它会运行得很好,但无论出于什么原因,当我尝试连接他们的名字和姓氏,并按指定的别名分组时,它都不起作用。我做错了什么

SELECT DISTINCT sf.StfFirstName  + ' ' + sf.StfLastname As StaffName, COUNT(fc.StaffID) 
FROM Staff sf
JOIN Faculty_Classes fc
ON sf.StaffID = fc.StaffID
join Classes cl
ON fc.ClassID = cl.ClassID
GROUP BY Sf.StaffName

只需重复select子句中使用的逻辑。它可能看起来效率低下,但事实并非如此。注意:如果粘贴到GROUPBY子句中,请忽略该逻辑的别名

SELECT sf.StfFirstName  + ' ' + sf.StfLastname As StaffName, 
COUNT(fc.StaffID) 
FROM Staff sf
JOIN Faculty_Classes fc
     ON sf.StaffID = fc.StaffID
join Classes cl
     ON fc.ClassID = cl.ClassID
GROUP BY sf.StfFirstName  + ' ' + sf.StfLastname
;
您也可以尝试不使用连接,它也应该可以工作

GROUP BY sf.StfFirstName, sf.StfLastname

select子句
中创建的别名不能被
group by子句
重用,因为select子句实际上是在group by之后执行的,换句话说,编写sql查询的顺序不是操作顺序。

只需重复select子句中使用的逻辑即可。它可能看起来效率低下,但事实并非如此。注意:如果粘贴到GROUPBY子句中,请忽略该逻辑的别名

SELECT sf.StfFirstName  + ' ' + sf.StfLastname As StaffName, 
COUNT(fc.StaffID) 
FROM Staff sf
JOIN Faculty_Classes fc
     ON sf.StaffID = fc.StaffID
join Classes cl
     ON fc.ClassID = cl.ClassID
GROUP BY sf.StfFirstName  + ' ' + sf.StfLastname
;
您也可以尝试不使用连接,它也应该可以工作

GROUP BY sf.StfFirstName, sf.StfLastname

select子句
中创建的别名不能被
groupby子句
重用,因为select子句实际上是在groupby之后执行的,换句话说,编写sql查询的顺序不是操作顺序。

您可以按照已经建议的用户使用顺序重复该逻辑,或者您也可以使用公共表表达式或派生表(如果愿意):

通用表表达式:

with cte_example -- with name_of_cte as (your query)
as
(
SELECT sf.StfFirstName  + ' ' + sf.StfLastname As StaffName, COUNT(fc.StaffID) 
FROM Staff sf
JOIN Faculty_Classes fc
ON sf.StaffID = fc.StaffID
join Classes cl
ON fc.ClassID = cl.ClassID
)

select *
from cte_example
group by StaffName
派生表:

select *
from
(
SELECT sf.StfFirstName  + ' ' + sf.StfLastname As StaffName, COUNT(fc.StaffID) 
FROM Staff sf
JOIN Faculty_Classes fc
ON sf.StaffID = fc.StaffID
join Classes cl
ON fc.ClassID = cl.ClassID
) t1 --note the table alias
group by StaffName

您可以重复用户使用的逻辑,或者您也可以使用公共表表达式或派生表,如果您愿意:

通用表表达式:

with cte_example -- with name_of_cte as (your query)
as
(
SELECT sf.StfFirstName  + ' ' + sf.StfLastname As StaffName, COUNT(fc.StaffID) 
FROM Staff sf
JOIN Faculty_Classes fc
ON sf.StaffID = fc.StaffID
join Classes cl
ON fc.ClassID = cl.ClassID
)

select *
from cte_example
group by StaffName
派生表:

select *
from
(
SELECT sf.StfFirstName  + ' ' + sf.StfLastname As StaffName, COUNT(fc.StaffID) 
FROM Staff sf
JOIN Faculty_Classes fc
ON sf.StaffID = fc.StaffID
join Classes cl
ON fc.ClassID = cl.ClassID
) t1 --note the table alias
group by StaffName

哦我忘了在已经使用
groupby
的单个查询中提到从不包含
selectdistinct
。正如我在下面的回答中提到的,group by在select之前执行,而group by在distinct之前执行。GROUPBY创建唯一的行,因此要求已经唯一的行“不同”纯粹是浪费时间和精力。我忘了在已经使用
groupby
的单个查询中提到从不包含
selectdistinct
。正如我在下面的回答中提到的,group by在select之前执行,而group by在distinct之前执行。GROUP BY创建唯一的行,因此要求已经唯一的行为“distinct”纯粹是浪费时间和精力。这两个示例都是正确的,但请注意,在两个子查询中都不需要distinct。感谢您指出,我没有跟踪查询。这两个示例都是正确的,但请注意,这两个子查询中都不需要distinct。感谢您指出,我没有跟踪查询。