ALTER PROCEDURE Sp_Num_Tracking
@UserID int
AS
BEGIN
declare @lastLogonDate datetime;
ALTER PROCEDURE Sp_num_Tracking
@UserID int
AS
BEGIN
declare @lastLogonDate datetime;
declare @CurrentLogonDate datetime;
declare @onemonthtime datetime;
declare @frmbeg int;
declare @oneweektime datetime;
select @lastLogonDate= max( crimedate) from tblcrime where UserID=@UserID
set @CurrentLogonDate=getdate()
set @onemonthtime=dateadd(mm,-1,@CurrentLogonDate)
set @oneweektime=dateadd(dd,-7,@CurrentLogonDate)
select @frmbeg= max(crimeID)-min(CrimeID) from tblcrime
SELECT count(o.crimeID)
from tblcrime o
inner join
tblContractor ts
on o.MainContractorID=ts.ContractorID
inner join
tblBusiness tb
on o.MainContractorBUID=tb.BusinessID
inner join tblservant tw on
o.servantID=tw.servantID
inner join tblUser u
on u.ContractorID=o.MainContractorID
where count(o.crimeID) between @lastLogonDate and @onemonthtime or count(o.crimeID) between @lastLogonDate and @oneweektime
END
但它给出的错误就像这样“聚合可能不会出现在WHERE子句中,除非它在HAVING子句或选择列表中包含的子查询中,并且聚合的列是外部引用”。哪部分我想修改.... Plz帮助
答案 0 :(得分:1)
由查询上的聚合确定的任何值都必须放入HAVING,因为它是在聚合查询上计算的,而不是在源查询上计算的。您还需要告诉它您要将计数分组的内容。
以此为例,假设您要查找符合条件的人的MAINCONTRACTORID:
SELECT
count(o.crimeID),
o.MainContractorID
from tblcrime o
inner join
tblContractor ts
on o.MainContractorID=ts.ContractorID
inner join
tblBusiness tb
on o.MainContractorBUID=tb.BusinessID
inner join tblservant tw on
o.servantID=tw.servantID
inner join tblUser u
on u.ContractorID=o.MainContractorID
GROUP BY
o.MainContractorID
HAVING
count(o.crimeID) between @lastLogonDate and @onemonthtime or count(o.crimeID) between @lastLogonDate and @oneweektime
注意:聚合是由一组函数确定的任何值,这些结果将被分组,如COUNT,SUM,AVG ..