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.
Was versuchen Sie zu erreichen. Beispieldaten und erwartetes Ergebnis hinzufügen –
Welche DBMS verwenden Sie? (Einige produktspezifische SQL-Anweisungen ...) – jarlh
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 –