2014-01-24 3 views
0

я разработал следующий SQL запрос, чтобы получить процентМожно ли упростить этот 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

+3

Было правило для программ C, которые я предполагаю, работают для SQL, тоже: * Любая программа C может быть сведенной до одной строки, которая содержит хотя бы одну ошибку *. \ * scnr \ * –

ответ

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

@parveen: спасибо, он отлично работает. Знаете ли вы, есть ли какая-либо разница в производительности по вашему запросу и той, которую я разработал? – user1263981

+0

Извините, я думаю, вы ответили на мой вопрос. Просто из интереса, я запустил план выполнения по обоим запросам, а ваш план запроса стоил 96%, а мой 54%. Просто интересно, почему ваш запрос стоит 96%, когда он ясен и прост и имеет меньше узлов в плане выполнения. Извините, нет опыта работы с планом выполнения. – user1263981

+0

@ user1263981: Предложение 'Where' будет выполнено до вычисленного столбца в' Select query'. В этом случае ваш запрос сначала будет фильтровать данные, а затем применить логику, где, когда мой запрос будет применен для каждой строки, и проверьте, '' DATEDIFF (DAY, v.ReportDate, v.SubmissionDate) 'is '> 2'. Проверьте это [статья] (http://www.sql.co.il/books/insidetsql2008/Logical%20Query%20Processing%20Poster.pdf) от Itzik Ben-Gan, который показывает логический порядок обработки SQL Server. BTW не каждый «Упрощенный и читаемый» запрос будет «результативным» – praveen

Смежные вопросы