Sql (续) 从Asgnmnt 式中(CallID=C.CallID)) 和上限(A.GroupName)=@GroupName 并在(@Assignee)中降低(A.EMail) 和上限(C.CallStatus)=@RecordType 和(@RecordType='CLOSED'和 C.在@StartDate和@EndDate)之间的结束日期)或 (@RecordType='REQUEST TO CLOSE'和 A.在@StartDate和@EndDate)之间的日期解析)或 (@RecordType“已关闭”和 @记录类型“请求关闭”) );
我已接受您的Sql (续) 从Asgnmnt 式中(CallID=C.CallID)) 和上限(A.GroupName)=@GroupName 并在(@Assignee)中降低(A.EMail) 和上限(C.CallStatus)=@RecordType 和(@RecordType='CLOSED'和 C.在@StartDate和@EndDate)之间的结束日期)或 (@RecordType='REQUEST TO CLOSE'和 A.在@StartDate和@EndDate)之间的日期解析)或 (@RecordType“已关闭”和 @记录类型“请求关闭”) );,sql,sql-server,database,Sql,Sql Server,Database,我已接受您的WHERE条款中的前四个条件。对于第五个条件,我没有使用大小写,而是选择了使用和、或和圆括号的等效形式。@StartDate和@EndDate之间的第一个子条件@RecordType='CLOSED'和C.ClosedDate相当于您在时的第一个子条件。第二个子条件@RecordType='REQUEST TO CLOSE'和A.DateResolv(介于@StartDate和@EndDate之间)与第二个等价。第三个子条件将允许满足其他条件的所有记录,其中@RecordType既不
WHERE
条款中的前四个条件。对于第五个条件,我没有使用大小写
,而是选择了使用和
、或
和圆括号的等效形式。@StartDate和@EndDate之间的第一个子条件@RecordType='CLOSED'和C.ClosedDate
相当于您在时的第一个子条件。第二个子条件@RecordType='REQUEST TO CLOSE'和A.DateResolv(介于@StartDate和@EndDate之间)
与第二个等价。第三个子条件将允许满足其他条件的所有记录,其中@RecordType
既不是关闭的
,也不是请求关闭的
。如果您希望在这些情况下返回空集,则应删除第三个子条件
从第四个WHERE
条件开始,其中UPPER(C.CallStatus)
等于CLOSED
或请求关闭
,那么@RecordType
也将如此。因此,在您的第五种情况下,我用@RecordType
替换了UPPER(C.CallStatus)
。除了可读性稍高之外,这还消除了语句中的四个函数调用,从而提高了语句的效率
我还将您的案例
从语句的早期修改为使用更少函数调用的等效条件,这些条件(可以说)更容易阅读,并且与字段别名更清晰地平行
如果您有任何问题或意见,请随时发表相应的评论
进一步阅读
其中column1=条件为case when条件时,则值为else column1结束。在这两种情况下都要这样做。那么您对此查询有什么问题?您能在这里显示一些示例数据和所需的输出吗?我只想在满足条件的情况下包含在where子句中此查询有什么问题?您似乎已经正确地实现了您的需求。其中column1=case when condition然后value else column1 end。在这两种情况下都要这样做。那么您对此查询有什么问题?您能在这里显示一些示例数据和所需的输出吗?我只想在满足条件的情况下包含在where子句中此查询有什么问题?您似乎已经正确地实现了您的需求。
SELECT C.CallID, A.GroupName,A.Assignee, C.CallStatus, C.RecvdDate, C.Urgency, C.Category, C.CallType, C.KPIreport, C.CallDesc,
DATEDIFF(DAY, C.RecvdDate,GETDATE()) [DurationInDays],
CASE
WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 30
THEN 'Less than 30'
WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 30 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 60
THEN '30-59'
WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 60 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 90
THEN '60-89'
WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 90 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 120
THEN '90-119'
WHEN DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 120
THEN 'Over 120'
END
AS 'AgeClassification'
FROM
CallLog C
INNER JOIN Asgnmnt A ON C.CallID = A.CallID
WHERE
A.HEATSeq =(SELECT MAX(HEATSeq)FROM Asgnmnt WHERE (CallID = C.CallID))
AND UPPER(A.GroupName) = @GroupName
AND LOWER(A.EMail) IN (@Assignee)
AND UPPER(C.CallStatus) = @RecordType
AND
CASE WHEN UPPER(C.CallStatus) = 'CLOSED' THEN
C.ClosedDate >= @StartDate AND C.ClosedDate <= @EndDate
WHEN UPPER(C.CallStatus) = 'REQUEST TO CLOSE' THEN
A.DateResolv >= @StartDate AND A.DateResolv <=@EndDate
END
ORDER BY A.GroupName, A.Assignee, C.RecvdDate, C.CallID
SELECT C.CallID,
A.GroupName,
A.Assignee,
C.CallStatus,
C.RecvdDate,
C.Urgency,
C.Category,
C.CallType,
C.KPIreport,
C.CallDesc,
Datediff(DAY, C.RecvdDate, Getdate()) [DurationInDays],
CASE
WHEN Datediff(DAY, C.RecvdDate, Getdate()) < 30 THEN 'Less than 30'
WHEN Datediff(DAY, C.RecvdDate, Getdate()) >= 30
AND Datediff(DAY, C.RecvdDate, Getdate()) < 60 THEN '30-59'
WHEN Datediff(DAY, C.RecvdDate, Getdate()) >= 60
AND Datediff(DAY, C.RecvdDate, Getdate()) < 90 THEN '60-89'
WHEN Datediff(DAY, C.RecvdDate, Getdate()) >= 90
AND Datediff(DAY, C.RecvdDate, Getdate()) < 120 THEN '90-119'
WHEN Datediff(DAY, C.RecvdDate, Getdate()) >= 120 THEN 'Over 120'
END AS 'AgeClassification'
FROM CallLog C
INNER JOIN Asgnmnt A
ON C.CallID = A.CallID
WHERE A.HEATSeq = (SELECT Max(HEATSeq)
FROM Asgnmnt
WHERE ( CallID = C.CallID ))
AND Upper(A.GroupName) = @GroupName
AND Lower(A.EMail) IN ( @Assignee )
AND Upper(C.CallStatus) = @RecordType
AND C.ClosedDate BETWEEN IIF(Upper(C.CallStatus) = 'CLOSED', @StartDate, C.ClosedDate)
AND IIF(Upper(C.CallStatus) = 'CLOSED', @EndDate, C.ClosedDate)
AND C.DateResolv BETWEEN IIF(Upper(C.CallStatus) = 'REQUEST TO CLOSE', @StartDate, C.DateResolv)
AND IIF(Upper(C.CallStatus) = 'REQUEST TO CLOSE',@EndDate, C.DateResolv)
ORDER BY A.GroupName,
A.Assignee,
C.RecvdDate,
C.CallID
SELECT C.CallID, A.GroupName,A.Assignee, C.CallStatus, C.RecvdDate,
C.Urgency, C.Category, C.CallType, C.KPIreport, C.CallDesc,
DATEDIFF(DAY, C.RecvdDate,GETDATE()) [DurationInDays],
CASE
WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 30) THEN 'Less than 30'
WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 30 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 60) THEN '30-59'
WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 60 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 90) THEN '60-89'
WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 90 AND DATEDIFF(DAY, C.RecvdDate,GETDATE()) < 120) THEN '90-119'
WHEN (DATEDIFF(DAY, C.RecvdDate,GETDATE()) >= 120) THEN 'Over 120'
END AS 'AgeClassification'
FROM CallLog C
INNER JOIN Asgnmnt A ON C.CallID = A.CallID
WHERE A.HEATSeq =(SELECT MAX(HEATSeq)FROM Asgnmnt WHERE (CallID = C.CallID))
AND UPPER(A.GroupName) = @GroupName
AND LOWER(A.EMail) IN (@Assignee)
AND UPPER(C.CallStatus) = @RecordType
AND (CASE
WHEN UPPER(C.CallStatus) = 'CLOSED' THEN C.ClosedDate
WHEN UPPER(C.CallStatus) = 'REQUEST TO CLOSE' THEN A.DateResolv
END) BETWEEN @StartDate AND @EndDate
ORDER BY A.GroupName, A.Assignee, C.RecvdDate, C.CallID
SELECT C.CallID,
A.GroupName,
A.Assignee,
C.CallStatus,
C.RecvdDate,
C.Urgency,
C.Category,
C.CallType,
C.KPIreport,
C.CallDesc,
DATEDIFF( DAY,
C.RecvdDate,
GETDATE() ) AS DurationInDays,
CASE
WHEN DATEDIFF( DAY,
C.RecvdDate,
GETDATE() ) < 30 THEN
'Less than 30'
WHEN DATEDIFF( DAY,
C.RecvdDate,
GETDATE() ) BETWEEN 30 AND 59
'30-59'
WHEN DATEDIFF( DAY,
C.RecvdDate,
GETDATE() ) BETWEEN 60 AND 89
'60-89'
WHEN DATEDIFF( DAY,
C.RecvdDate,
GETDATE() ) BETWEEN 90 AND 119
'90-119'
WHEN DATEDIFF( DAY,
C.RecvdDate,
GETDATE() ) >= 120 THEN
'120 or over'
END AS 'AgeClassification'
FROM
CallLog C
INNER JOIN Asgnmnt A ON C.CallID = A.CallID
WHERE
A.HEATSeq =( SELECT MAX( HEATSeq )
FROM Asgnmnt
WHERE ( CallID = C.CallID ) )
AND UPPER( A.GroupName ) = @GroupName
AND LOWER( A.EMail ) IN ( @Assignee )
AND UPPER( C.CallStatus ) = @RecordType
AND ( ( @RecordType = 'CLOSED' AND
C.ClosedDate BETWEEN @StartDate AND @EndDate ) OR
( @RecordType = 'REQUEST TO CLOSE' AND
A.DateResolv BETWEEN @StartDate AND @EndDate ) OR
( @RecordType <> 'CLOSED' AND
@RecordType <> 'REQUEST TO CLOSE' )
);