2015-11-26 9 views
14

Wie kann die Funktion SUM() für Bitspalten in T-SQL verwendet werden?Wie kann ich SUM für Bit-Spalten verwenden?

Wenn ich versuche, es zu tun, wie unten:

SELECT SUM(bitColumn) FROM MyTable; 

ich den Fehler:

Operand data type bit is invalid for sum operator.

+0

Es hängt davon ab, was Sie denken, dass eine Summe einer Bitspalte bedeuten soll. SQL Server lässt das nicht zu, da es nicht eindeutig ist, da Bitspalten oft boolesche Werte oder Bitmasken sind. Es ist wie "Was ist der Wert von' Add (True, False) '?" Nun, ist Add() eine UND-Funktion oder eine ODER-Funktion? –

+0

Es ist nur eine Möglichkeit, Ergebnisse zu gruppieren. In meinem Szenario hat ein Datensatz BitColumn True und andere Datensätze BitColumn False, aber ich möchte nicht, dass die Gruppierung deswegen verloren geht. Also summiere ich die "Bit" -Spalten und ich bin interessiert, wenn die SUM größer als 0 ist. –

Antwort

24
SELECT SUM(CAST(bitColumn AS INT)) 
FROM dbo.MyTable 

Notwendigkeit zu werfen in der Zahl

oder eine andere Lösung -

SELECT COUNT(*) 
FROM dbo.MyTable 
WHERE bitColumn = 1 
+1

Meine Abfrage ist in der Tat sehr viel komplexer als das Beispiel auf meine Frage. Die BitColumn kommt aus einer Join-Tabelle und meine Ergebnisse sind gruppiert. Ich möchte nicht aufhören, die Ergebnisse zurückzugeben, bei denen BitColumn False ist. Aber Lösung 1 ist perfekt. So einfach! –

+0

sind Sie herzlich willkommen;) – Devart

4

Sie mithilfe von CONVERT erreichen können,

SELECT SUM(CONVERT(INT, bitColumn)) FROM MyTable 
8

Sie 0 als NULL-Werte in Erwägung ziehen könnte und einfach die verbleibenden Werte zählen:

SELECT count(nullif(bitColumn, 0)) 
FROM MyTable; 
1

Sie CAST verwenden können und CONVERT-Funktion für den Datentyp zu integer oder Datentyp der Nummer

Versuchen Sie, diese Codeblöcke:

SELECT SUM(CAST(bitColumn AS INT)) as bitColumn 
FROM MyTable 

oder

SELECT CONVERT(INT, bitColumn) 
FROM MyTable 
0

Etwas kryptisch:

declare @Foo as Bit = 1; 
-- @Foo is a Bit. 
select SQL_Variant_Property(@Foo, 'BaseType'); 
-- But adding zero results in an expression with data type Int. 
select SQL_Variant_Property(@Foo + 0, 'BaseType'); 
select Sum(@Foo + 0); 

declare @Samples as Table (Foo Bit); 
insert into @Samples (Foo) values (0), (1), (0), (0), (1), (1), (1), (1); 
select Sum(Foo + 0) from @Samples; 

Dies verbessert sicherlich nicht die Lesbarkeit oder Wartbarkeit, aber es ist kompakt.

0

SELECT SUM (bitColumn * 1) FROM dbo.MyTable

Wandelt das Bit in int, durch Multiplikation, saubere und einfache

0

Sie SIGN Funktion verwenden:

CREATE TABLE tab_x(b BIT); 
INSERT INTO tab_x(b) VALUES(1),(0),(0),(NULL),(0),(1); 

SELECT SUM(SIGN(b)) 
FROM tab_x; 
-- 2 

DBFiddle Demo

Verwandte Themen