2015-08-27 5 views
5

Ich versuche SEDE zu verwenden, um festzustellen, wie viele Tag-basierte Abzeichen insgesamt vergeben wurden. Meine typische Strategie zusammenzufassen ist:Wie kann ich eine Bit-Typ-Spalte zählen?

select sum(TagBased) 
from Badges 

Leider, da TagBased etwas Wert ist, ich diese Fehlermeldung erhalten:

Operand data type bit is invalid for sum operator.

Aus Verzweiflung habe ich versucht, Zahl:

select count(TagBased) 
from Badges 

Dies zählt die Anzahl der Nicht-Null-Werte, die in diesem Fall identisch mit count(*) ist. Wie kann also ein Bit-Wert aggregiert verwendet werden?

Antwort

10

Wenn Sie nur bei Tag-basierte Abzeichen aussehen wollen und kümmern sich nicht um den Rest, können Sie den Test auf die bewegen, wo Klausel:

select count(*) 
from Badges 
where TagBased = 1 

Die kanonische Lösung wäre zu werfen der Bit-Wert auf einen Datentyp, die zusammengefasst werden können:

select sum(cast(TagBased as decimal)) 
from Badges 

eine noch flexiblere Lösung ist die Umwandlung selbst mit einem CASE statement zu tun:

select sum(case TagBased when 1 then 100.0 end)/count(*) tag_based_per 
from Badges 

in neueren Versionen von SQL Server Alternativ gibt es eine IIF function:

select sum(iif(TagBased = 1, 1, 0)) 
from Badges 

Schließlich, wenn Sie Golf spielen, können Sie SQL in Umwandlung der Bit für Sie Trick:

select sum(TagBased+0) 
from Badges 

Die Kredit für diese Technik geht zu Kenneth Baltrinic 's Antwort auf eine spezifischere Frage.

Als Referenz (und potentielle Gabelung): my test queries.

+0

vielleicht Sie können diese auch hinzufügen 'wählen Sie die Summe (TagBased & 1) von Badges'? – Saidolim

+0

Ich war noch nie auf http://data.stackexchange.com, bis ich deinen letzten Link gesehen habe - jetzt fühle ich, dass der Rest meines Abends verdunsten wird ... – TwoStraws

1

Ein weiteres Verfahren zur COUNT nur 1 von BIT Spalte NULLIF verwenden:

SELECT COUNT(NULLIF(TagBased,0)) AS result 
FROM Badges b; 

LiveDemo


Eine weitere Methode SIGN Verwendung:

SELECT SUM(SIGN(TagBased)) AS result 
FROM Badges b; 

LiveDemo2


Und noch eine Art und Weise.Ich bin nicht sicher, warum ich es geschrieben habe:

SELECT DISTINCT TOP 1 RANK() OVER(ORDER BY TagBased DESC) - 1 
FROM Badges b 
ORDER BY 1 DESC; 

LiveDemo3

1

Eine der Möglichkeiten, mit Bit-Operatoren.

select sum(TagBased&1) from Badges 

Im Allgemeinen können Sie mehrere Bitwerte in einer ganzen Zahl speichern. Zum Beispiel habe ich 5 Arten von Bages. Sie können Werte setzen wie:

  • 1 - Code
  • 2 - Bit
  • 4 - Byte
  • 8 -

programing wenn Sie Code und byte zur gleichen setzen müssen Zeit. Es wird 1 + 4 = 5

nun sein, wie Code bages

zählen
select sum(TagBased & 1) from Badges 

Jetzt zählen, wie Byte bages

zählen zugleich
select sum(TagBased & 4)/4 from Badges 

Nun zählen, Code und Byte bages zählen bei allen

select count(TagBased & 5) from Badges where TagBased & 5 > 0 
Verwandte Themen