2015-11-26 13 views
14

Come si può utilizzare la funzione SUM() per le colonne di bit in T-SQL?Come posso usare SUM per le colonne di bit?

Quando provo farlo come di seguito:

SELECT SUM(bitColumn) FROM MyTable; 

ottengo l'errore:

Operand data type bit is invalid for sum operator.

+0

Dipende da ciò che si suppone significhi una somma di una colonna di bit. SQL Server non lo consente perché è ambiguo perché le colonne bit sono spesso valori booleani o maschere di bit. È come chiedere "Qual è il valore di' Aggiungi (Vero, Falso) '?" Bene, Aggiungi() una funzione AND o una funzione OR? –

+0

È solo un modo per raggruppare i risultati. Nel mio scenario, un record ha bitColumn True e altri record hanno bitColumn False, ma non voglio che il raggruppamento venga perso a causa di ciò. Quindi sto sommando le colonne "bit" e sono interessato se SUM è maggiore di 0. –

risposta

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

necessità di gettare nella serie

o un'altra soluzione -

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

La mia query è in realtà molto più complessa dell'esempio sulla mia domanda. Il bitColumn proviene da una tabella unita e i miei risultati sono raggruppati. Non voglio smettere di restituire i risultati dove bitColumn è False. Ma la soluzione 1 è perfetta. Cosi 'semplice! –

+0

siete i benvenuti;) – Devart

4

È possibile ottenere utilizzando CONVERT,

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

Si potrebbe considerare 0 come null e semplicemente contare i valori rimanenti:

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

È possibile utilizzare CAST e funzione CONVERT per il tipo di dati in intero o numero di dati.

provare questo blocchi di codice:

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

o

SELECT CONVERT(INT, bitColumn) 
FROM MyTable 
0

Un po 'criptico:

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; 

Questo certamente non migliora la leggibilità o la manutenibilità, ma è compatta.

0

SELECT SUM (bitColumn * 1) DA dbo.MyTable

Converte la punta nel int, per moltiplicazione, pulito e semplice

0

È possibile utilizzare la funzione SIGN:

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

Problemi correlati