2016-11-15 2 views
0

Ich habe versucht, dies ohne Erfolg herauszufinden. Ich habe eine Tabelle namens Appraisal, die eine Spalte StatusID hat. Ich muss die Anzahl der Bewertungen nach StatusId gruppieren. Einige Datensätze in Appraisal haben NULL/leere Werte in der StatusID. Das Endergebnis wäre, 0 zurückzugeben, wenn ein Beurteiler eine Beurteilung mit hat.SQL Server Abfrage COUNT NULL/Leerzeichen und GROUP BY

Bewertung

[AppraisalId] [AppraiserId] [StatusId] 
1   11111   1 
2   11111   2 
3   11111   NULL 
4   22222   4 
5   22222   NULL 
... 

AppraisalStatus

[AppraisalStatusId] [AppraisalStatusName] 
2     Assigned 
3     Accepted 
6     Conditionally Declined 
7     Completed 
10     On Hold 
11     Order Not Accepted 

Beurteiler

[AppraiserId] 
11111 
22222 

Abfrage:

SELECT 
    AppraisalStatus.AppraisalStatusId, 
    COUNT(ISNULL(Appraisal.StatusId, 0)) AS "number_of_orders" 
FROM 
    AppraisalStatus 
LEFT JOIN 
    Appraisal ON AppraisalStatus.AppraisalStatusId = Appraisal.StatusId 
WHERE 
    AppraiserId = :AppraiserId 

Die Ergebnisse in JSON

[{ 
    "AppraisalStatusId": 2, 
    "number_of_orders": 1 
}, { 
    "AppraisalStatusId": 3, 
    "number_of_orders": 5 
}, { 
    "AppraisalStatusId": 7, 
    "number_of_orders": 184 
}, { 
    "AppraisalStatusId": 10, 
    "number_of_orders": 2 
}] 
+1

fehlt Ihnen irgendwo eine GROUP BY? –

+0

nicht sicher, ich habe einige Erklärungen gelesen. Ich kann nicht die Abfrage erhalten, um "AppraisalStatusId" zurückzugeben: 6, "number_of_orders": 0 – Jeffry

Antwort

1

Ist das, was Sie beabsichtigen?

SELECT aps.AppraisalStatusId, COUNT(a.StatusId) as number_of_orders 
FROM AppraisalStatus aps LEFT JOIN 
    Appraisal a 
    ON aps.AppraisalStatusId = a.StatusId AND 
     a.AppraiserId = :AppraiserId 
GROUP BY aps.AppraisalStatusId; 

Dies wird eine Zeile für jeden Status für den angegebenen Appraiser zurückgeben. Wenn es keine passenden Datensätze sind dann ist der Wert 0.

+0

nicht ganz, Blick in das Konzept, danke – Jeffry

+0

Wie unterscheidet sich das von dem, was Sie wollen? –

+0

Erster Fehler: Nachricht: Die mehrteilige Kennung "ap.AppraiserId" konnte nicht gebunden werden. – Jeffry

0

Sie SUM statt COUNT mit GROUP BY verwenden können.

SELECT 
    AppraisalStatus.AppraisalStatusId, 
    SUM(IIF(Appraisal.StatusId IS NULL, 0, 1)) AS "number_of_orders" 
FROM 
    AppraisalStatus 
LEFT JOIN 
    Appraisal ON AppraisalStatus.AppraisalStatusId = Appraisal.StatusId 
WHERE 
    AppraiserId = :AppraiserId 
GROUP BY AppraisalStatus.AppraisalStatusId 
+0

Vielen Dank für den Vorschlag, sehr geschätzt. Ich erhalte die Fehlermeldung "Falsche Syntax in der Nähe des Schlüsselwortes 'IS'". Bei weiteren Untersuchungen ist IIF in SQL 2008, der Version der Datenbank, keine gültige Funktion. Obwohl ich nicht sicher bin, warum er sich über IS – Jeffry

+0

beschwert, verwende ich SQL Server 2012, ich bin nicht sicher, ob SQL Server 2008 "IIF" unterstützt oder nicht. Sie können auch CASE-Anweisung anstelle von IIF verwenden. – unknown