2014-01-23 38 views
0

我設計了一個下面的sql查詢來獲得12月份完成的訪問總數。我如何使這個SQL查詢更簡單/更短?

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 SEVER 2008使用內部查詢?

+0

請評論您的問題。如果首先這樣做的話,它將會被更嚴肅地對待,更多的人會提供幫助。 http://stackoverflow.com/editing-help#comment-formatting – TTeeple

回答

0

它在我看來像外部查詢是不必要的。這應該會給出相同的結果:

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)之間沒有區別。

0
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) 
+0

你的SQL不起作用。 COUNT(q.MonthName)不再存在於內部查詢的上下文之外。 – 64BitBob

+0

該死的複製/粘貼...謝謝 –

0

你基本上已經完成了你的內部查詢。只是幾個變化:

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) 
+1

你的「性能增強」沒有效果。只要BETWEEN語句對他的用例在邏輯上是正確的,它就會產生與使用「<=" and "> =」比較完全相同的查詢計劃。 來源:http://www.sql-server-performance.com/forum/threads/which-is-faster-between-or-and.12165/ – 64BitBob

+0

@ 64BitBob我以爲我曾經在某個時候讀過BETWEEN沒有正確使用索引。經過長時間的編碼之後,可能會成爲一個狂野的夢想。謝謝你的提示! – TTeeple