Sql server 如何使此SQL查询更简单/更短?

Sql server 如何使此SQL查询更简单/更短?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我设计了以下sql查询,以获得12月份完成的访问总数 select q.MonthName, count(q.MonthName) as TotalVisit from ( SELECT DATENAME( MONTH,v.VisitDate) as MonthName FROM Visits v INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID WHERE a.ClientID IN (33,67) AND v.

我设计了以下sql查询,以获得12月份完成的访问总数

select q.MonthName, count(q.MonthName) as TotalVisit  from
(
SELECT DATENAME( MONTH,v.VisitDate) as MonthName     
FROM Visits v
INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID
WHERE a.ClientID IN (33,67)
AND v.VisitDate BETWEEN '01/12/2013' AND '31/12/2013' 
)q
group by q.MonthName 
结果:

MonthName   TotalVisit

December    164

在SQL Server 2008中,不使用内部查询而编写单个查询是否可以获得相同的结果?

在我看来,外部查询是不必要的。这将产生相同的结果:

SELECT DATENAME( MONTH,v.VisitDate) as MonthName,
  COUNT(*) AS TotalVisit
FROM Visits v
INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID
WHERE a.ClientID IN (33,67)
  AND v.VisitDate BETWEEN '01/12/2013' AND '31/12/2013' 
GROUP BY DATENAME( MONTH,v.VisitDate)
SELECT DATENAME(MONTH,v.VisitDate) as MonthName, count(*) as TotalVisit
FROM Visits v
INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID
WHERE a.ClientID IN (33,67)
AND v.VisitDate BETWEEN '01/12/2013' AND '31/12/2013' 
group by DATENAME(MONTH,v.VisitDate)

这是因为“count()”函数实际上只是在计算记录。所以count(*)和count(MonthName)之间没有区别。

基本上是在内部查询中完成的。只是几个变化:

SELECT DATENAME(MONTH,v.VisitDate) as MonthName
,COUNT(v.ID) AS Visits  
FROM Visits v
INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID
WHERE a.ClientID IN (33,67)
AND (v.VisitDate >= '01/12/2013' AND  v.VisitDate <= '31/12/2013') --changed this for performance
GROUP BY DATENAME(MONTH,v.VisitDate)
选择DATENAME(月,v.VisitDate)作为MonthName
,将(v.ID)计算为访问
从访问v
a.AssignmentID=v.AssignmentID上的内部联接分配a
其中a.ClientID IN(33,67)

和(v.VisitDate>='01/12/2013'和v.VisitDate请对您的问题进行评论。如果首先这样做,将会更加认真,更多的人会提供帮助。您的SQL不起作用。COUNT(q.MonthName)不再存在于内部查询的上下文之外。您的“性能增强”没有效果。只要BETWEEN语句在逻辑上适合他的用例,它将生成与使用“=”比较完全相同的查询计划。来源:@64BitBob我想我在某个时候读到BETWEEN没有正确使用索引。经过漫长的编码之夜,这可能是一个疯狂的梦想。谢谢你的提示!