2016-12-06 3 views
0

У меня есть следующий сценарий в моем SQL-запросе. Я должен использовать ROW_NUMBER() в моем запросе, где некоторые агрегированные функции также используются для получения результата.Как использовать ROW_NUMBER() вместе с агрегатными функциями?

SELECT 
    @TotalRequests = ReportCount.TotalCount, 
    @TotalTimeToRespond = ReportCount.TotalTimeToRespond, 
    @TotalRequestsHavingQnA = ReportCount.TotalRequestsHavingQnA, 
    @ResponseCompliance = ReportCount.ResponseCompliance, 
    @TotalSubmissions = ReportCount.TotalSubmissions 
FROM 
    (SELECT 
     TotalCount = Count(1), 
     TotalTimeToRespond = SUM(Datediff(DAY, DCR.DateReceivedInCB, DCR.DueDate)), 
     TotalRequestsHavingQnA = SUM(CASE 
             WHEN DCR.NoOfQuestionsAsked IS NULL 
                OR DCR.NoOfQuestionsAsked = 0 THEN 0 
               ELSE 1 
              END), 
     ResponseCompliance = Sum(CASE 
              WHEN DCR.NoOfQuestionsAsked IS NULL 
               OR DCR.NoOfQuestionsAsked = 0 THEN 0 
              ELSE (Cast(DCR.NoOfQuestionsAnswered AS DECIMAL) * 100)/Cast(DCR.NoOfQuestionsAsked AS DECIMAL) 
             END), 
     TotalSubmissions = Sum(CASE 
             WHEN DCR.DateSubmitted IS NOT NULL THEN 1 
             ELSE 0 
             END), 
       rowNumber = Row_number() 
          OVER (
           PARTITION BY DCR.callref 
           ORDER BY DCR.DateSubmitted DESC) 
    FROM 
     DimCBComparisonReport DCR 
    INNER JOIN 
     DimClientLoc DCL ON DCR.ClientLocKey = DCL.ClientLocKey 
    WHERE 
     Ltrim(Rtrim(DCL.LocId)) IN (SELECT PARAM 
            FROM Fn_splitparam(@LocationIdList, ',')) 
     AND (CASE 
       WHEN @EnabledDateType = 'D' THEN DCR.DueDate 
         ELSE DCR.DateSubmitted 
       END) BETWEEN @StartDate AND @EndDate 
     AND DCL.ContractId = @ContractRef 
     AND DCR.EmployeeKey IS NOT NULL) ReportCount 
WHERE 
    ReportCount.rowNumber = 1 

Так вот я получаю исключение, как:

Msg 8120, Level 16, State 1, процедура etl_CaseBuilder_get_Location_Compliance_Summary, Линия 41
Колонка 'DimCBComparisonReport.CallRef' недопустим в списке выбора потому что не содержится ни в агрегатной функции, ни в предложении GROUP BY .

Любая помощь будет глубоко оценена.

+1

Что вы пытаетесь достичь. Добавить пример данных и ожидаемый результат –

+1

Какие dbms вы используете? (Некоторый специфический SQL-код продукта ...) – jarlh

+4

В вашем выбранном запросе будет возвращена только одна запись, которую вы можете напрямую назначить переменным, вам не нужно 'row_number'. Если вы пытаетесь достичь чего-то еще, то объясните, –

ответ

0

Из того, что я вижу, остальные ваши столбцы в этом запросе агрегируются, не будучи оконными функциями. Я бы изменил их все, чтобы быть оконными функциями (например, sum() over (partition by x) as [Field]), а затем измените его на отдельный, посмотрите, работает ли это.

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