2016-12-06 3 views
0

Ich habe das folgende Szenario in meiner SQL-Abfrage. Ich muss ROW_NUMBER() in meiner Abfrage verwenden, wo einige Aggregatfunktionen auch verwendet werden, um das Ergebnis zu erhalten.Wie verwendet man ROW_NUMBER() zusammen mit Aggregatfunktionen?

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 

Also hier ist wie eine Ausnahme bin immer:

Msg 8120, Ebene 16, Status 1, Prozedur etl_CaseBuilder_get_Location_Compliance_Summary, Zeile 41
Spalte 'DimCBComparisonReport.CallRef' ist ungültig in der Auswahlliste weil es weder in einer Aggregatfunktion noch in der GROUP BY Klausel enthalten ist.

Jede Hilfe wird sehr geschätzt.

+1

Was versuchen Sie zu erreichen. Beispieldaten und erwartetes Ergebnis hinzufügen –

+1

Welche DBMS verwenden Sie? (Einige produktspezifische SQL-Anweisungen ...) – jarlh

+4

Ihre Auswahlabfrage gibt nur einen Datensatz zurück, den Sie direkt Variablen zuweisen können, die nicht 'row_number' benötigen. Wenn Sie versuchen, etwas anderes zu erreichen, dann erklären Sie –

Antwort

0

Von dem, was ich sehen kann, sind die restlichen Spalten in dieser Abfrage aggregiert ohne Fensterfunktionen zu sein. Ich würde sie alle ändern, um Fensterfunktionen zu sein (z. B. sum() over (partition by x) as [Field]) und dann zu einem Select-Distinct ändern, sehen, ob das funktioniert.

Verwandte Themen