COUNT UNTERSCHIEDLICH MIT BEDINGUNGEN

102

Ich möchte die Anzahl der unterschiedlichen Elemente in einer Spalte zählen, die einer bestimmten Bedingung unterliegen, z. B. wenn die Tabelle wie folgt aussieht:

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3

Was kann ich tun, wenn ich die Anzahl der unterschiedlichen Tags als "Tag-Anzahl" und die Anzahl der unterschiedlichen Tags mit der Eintrags-ID> 0 als "positive Tag-Anzahl" in derselben Tabelle zählen möchte?

Ich zähle jetzt aus zwei verschiedenen Tabellen, in denen ich in der zweiten Tabelle nur die Zeilen mit einer Eintrags-ID größer als Null ausgewählt habe. Ich denke, es sollte einen kompakteren Weg geben, um dieses Problem zu lösen.

derekhh
quelle

Antworten:

255

Sie können dies versuchen:

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;

Das erste count(distinct...)ist einfach. Die zweite, die etwas komplex aussieht, ist tatsächlich dieselbe wie die erste, außer dass Sie die case...whenKlausel verwenden. In der case...whenKlausel filtern Sie nur positive Werte. Nullen oder negative Werte werden als ausgewertet nullund nicht in die Zählung einbezogen.

Hierbei ist zu beachten, dass dies durch einmaliges Lesen der Tabelle erfolgen kann. Wenn es so aussieht, als müssten Sie dieselbe Tabelle zweimal oder öfter lesen, können Sie dies in den meisten Fällen einmal tun. Infolgedessen wird die Aufgabe mit weniger E / A viel schneller erledigt.

ntalbs
quelle
2
Aber wird sich positive_tag_count dann auch unterscheiden?
Derekh
Die bearbeitete Abfrage löst das Problem immer noch nicht. Funktioniert dies nicht jetzt für unterschiedliche entryId-Werte anstatt für unterschiedliche Tags?
BrianC
Dies ist eine wirklich kluge Lösung.
Luc
Ich habe mehrere Spalten in meinem eindeutigen (Beispielanzahl (eindeutiges Tag, Datum)). Gibt es eine Möglichkeit, mehrere Spalten in der then-Klausel zu haben? Wenn ich nur ein Tag mache, löst das Datum eine Analyse-Ausnahme aus
Crusaderpyro
@ Crusaderpyro Das geht über den Rahmen der ursprünglichen Frage hinaus. Ich würde dafür eine neue Frage erstellen.
Ntalbs
2

Versuchen Sie die folgende Aussage:

select  distinct A.[Tag],
     count(A.[Tag]) as TAG_COUNT,
     (SELECT count(*) FROM [TagTbl] AS B WHERE A.[Tag]=B.[Tag] AND B.[ID]>0)
     from [TagTbl] AS A GROUP BY A.[Tag]

Das erste Feld ist das Tag, das zweite die gesamte Anzahl, das dritte die positive Anzahl.

MJBLACKEND
quelle
1

Dies kann funktionieren:

SELECT Count(tag) AS 'Tag Count'
FROM Table
GROUP BY tag

und

SELECT Count(tag) AS 'Negative Tag Count'
FROM Table
WHERE entryID > 0
GROUP BY tag
zaz
quelle
0

Dies kann auch funktionieren:

SELECT 
    COUNT(DISTINCT T.tag) as DistinctTag,
    COUNT(DISTINCT T2.tag) as DistinctPositiveTag
FROM Table T
    LEFT JOIN Table T2 ON T.tag = T2.tag AND T.entryID = T2.entryID AND T2.entryID > 0

Sie benötigen die entryID-Bedingung im linken Join und nicht in einer where-Klausel, um sicherzustellen, dass alle Elemente, die nur eine entryID von 0 haben, im ersten DISTINCT ordnungsgemäß gezählt werden.

BrianC
quelle
1
Diese Abfrage liest die Tabelle zweimal. Dies kann durch einmaliges Lesen der Tabelle erfolgen.
Ntalbs
0

Code zählt die eindeutige / eindeutige Kombination von Tag- und Eintrags-ID, wenn [Eintrags-ID]> 0 ist

select count(distinct(concat(tag,entryId)))
from customers
where id>0

In der Ausgabe wird die Anzahl der eindeutigen Werte angezeigt. Ich hoffe, dies hilft

Abhishek Gupta
quelle