这可以简化这个SQL查询吗?

时间:2014-01-24 10:45:18

标签: sql sql-server sql-server-2008

我设计了以下sql查询来获取

的百分比
100 -  ((reportedDate – Submission Date) / TotalNumOfVisits) * 100

有没有办法简化它?比如将两个查询合并为一个?

SELECT 
  q1.VisitMonth,q1.TotalVisit, ISNULL(q2.diff,0) AS DIFF
  ,100 - ISNULL( (CAST((q2.diff * 1.0 / q1.TotalVisit ) * 100 AS FLOAT)),0) PERC
FROM
(
  SELECT DATENAME(MONTH,v.VisitDate) as VisitMonth, count(v.VisitID) as TotalVisit
  FROM Visits v
  INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID
  WHERE a.ClientID IN (33,46)
    AND v.VisitDate BETWEEN '01/01/2013' AND '31/12/2013'
  group by DATENAME(MONTH,v.VisitDate)
) q1
LEFT OUTER JOIN
(
  SELECT DATENAME(MONTH,v.VisitDate) as MonthName,COUNT(*) as diff
  FROM Visits v
  INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID
  WHERE a.ClientID IN (33,46)
    AND v.VisitDate BETWEEN '01/01/2013' AND '31/12/2013'
    AND DATEDIFF(DAY,v.ReportDate,v.SubmissionDate) > 2
  group by DATENAME(MONTH,v.VisitDate)
) q2
ON q1.VisitMonth = q2.MonthName

结果:

enter image description here

1 个答案:

答案 0 :(得分:2)

试试这个: -

 Select 
      VisitMonth,isnull(diff,0) as DIFF,
      100 - ISNULL( (CAST((diff * 1.0 / Nullif(TotalVisit,0) ) * 100 AS FLOAT)),0) PERC
 from 
 (
  SELECT 
       VisitMonth = Datename(month,visitDate) ,
       Diff =  Sum(case when DATEDIFF(DAY,v.ReportDate,v.SubmissionDate) > 2 then 1 
                   else 0 end) ,
       TotalVisit = Count(v.VisitID)
 FROM Visits v
 INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID
 WHERE a.ClientID IN (33,46)
 AND v.VisitDate BETWEEN '01/01/2013' AND '31/12/2013'
 group by DATENAME(MONTH,v.VisitDate)
)a