Ich erstelle eine Abfrage mit einer GROUP BY
Klausel, die die Fähigkeit benötigt, Datensätze nur basierend auf einer bestimmten Bedingung zu zählen (z. B. nur Datensätze zählen, bei denen ein bestimmter Spaltenwert gleich 1 ist).
SELECT UID,
COUNT(UID) AS TotalRecords,
SUM(ContractDollars) AS ContractDollars,
(COUNTIF(MyColumn, 1) / COUNT(UID) * 100) -- Get the average of all records that are 1
FROM dbo.AD_CurrentView
GROUP BY UID
HAVING SUM(ContractDollars) >= 500000
Die COUNTIF()
Zeile schlägt offensichtlich fehl, da keine native SQL-Funktion aufgerufen COUNTIF
wird. Hier geht es jedoch darum, den Prozentsatz aller Zeilen zu bestimmen, die den Wert '1' für MyColumn haben.
Überlegen Sie, wie Sie dies in einer MS SQL 2005-Umgebung ordnungsgemäß implementieren können?
quelle
ISNULL
, stattdessen können Sie dies tunCASE WHEN myColumn IS NULL
oder verwendenifnull
( stackoverflow.com/a/799406/1861346 )Normalerweise mache ich das, was Josh empfohlen hat, aber ich habe mir eine etwas hokey Alternative ausgedacht, die ich gerne teilen wollte.
Sie können die Tatsache nutzen, dass COUNT (ColumnName) keine NULL-Werte zählt, und Folgendes verwenden:
NULLIF - gibt NULL zurück, wenn die beiden übergebenen Werte identisch sind.
Vorteil: Drückt Ihre Absicht aus, Zeilen zu zählen, anstatt die SUM () - Notation zu haben. Nachteil: Nicht so klar, wie es funktioniert ("Magie" ist normalerweise schlecht).
quelle
ISNULL
Folgendes hinzufügte :SELECT COUNT(NULLIF(0, ISNULL(myColumn, 0)))
. Warten Sie, das sieht nur hässlich aus ...Ich würde diese Syntax verwenden. Es entspricht den Vorschlägen von Josh und Chris, ist jedoch ANSI-konform und nicht an einen bestimmten Datenbankanbieter gebunden.
quelle
NULLIF
ist in Standard SQL-92 enthalten). Joshs Antwort lässt sich leicht in Standard - SQL umgewandelt werden durch Ersetzenisnull
mitCOALESCE
.=
. Ich benutze es für "Zähle die Anzahl der Antworten> = 2".Josh's Antwort ergänzen,
Funktionierte gut für mich (in SQL Server 2012), ohne die 'Anzahl' in eine 'Summe' zu ändern, und dieselbe Logik ist auf andere 'bedingte Aggregate' übertragbar. ZB Summieren basierend auf einer Bedingung:
quelle
Wie wäre es mit
Kürzer als
CASE
:)Funktioniert, weil
COUNT()
keine Nullwerte gezählt werden undIF
/CASE
null zurückgibt, wenn die Bedingung nicht erfüllt ist und keine vorhanden istELSE
.Ich denke, es ist besser als zu benutzen
SUM()
.quelle
Nicht produktspezifisch, aber der SQL-Standard bietet
SELECT COUNT() FILTER WHERE <condition-1>, COUNT() FILTER WHERE <condition-2>, ... FROM ...
für diesen Zweck. Oder etwas, das ihm sehr ähnlich ist, ich weiß es nicht genau.
Und natürlich bleiben Anbieter lieber bei ihren proprietären Lösungen.
quelle
FILTER
ist PostgreSQL das einzige wichtige DBMS, das die Klausel tatsächlich anbietet , aber es wird vonCASE
allen emuliert .Warum nicht so?
quelle
Ich musste COUNTIF () in meinem Fall als Teil meiner SELECT-Spalten verwenden UND um einen Prozentsatz der Häufigkeit nachzuahmen, mit der jedes Element in meinen Ergebnissen angezeigt wurde.
Also habe ich das benutzt ...
Natürlich müssen Sie das Ergebnis entsprechend Ihren Anzeigeanforderungen formatieren.
quelle
quelle