2016-06-28 20 views
3

BeispieltabelleWie kann ich SUM Zeilen, die mindestens X Boolean 1s haben?

col1 col2 col3 col4 
Abe 1 0 1 
Bob 0 1 0 
Cam 1 1 1 
Dan 1 0 0 
Eve 1 1 1 

Wie kann ich so fragen, dass ich SUM, wie viele Menschen in col1 insgesamt 2 1s haben? (Also, da Abe die einzige Person mit 2 1s ist, gibt die Abfrage die Nummer 1 aus.)

Danke.

Antwort

2
Select count(*) from table_name where col2+col3+col4=2 
2

Verwenden Zugabe von Spalten in where-Klausel und SELECT COUNT()

select count(*) 
from my_table 
where CAST(ifnull(col2,false) AS SIGNED INTEGER) + 
     CAST(ifnull(col3,false) AS SIGNED INTEGER) + 
     CAST(ifnull(col4,false) AS SIGNED INTEGER) = 2; 
+0

können Sie als nützlich bewerten, .. jetzt sind Sie über 15 – scaisEdge

+0

einzige Sache. Wenn alle Spalten Datentyp sind, muss Bit mindestens 1 umwandeln. Wenn eine Null in einer der Spalten vorhanden ist, wird die gesamte Additionsoperation ebenfalls null (aka unbekannt) – Matt

+0

@Matt. Ich habe update die Antwort mit expliziten Konvertierung für Ihren Kommentar – scaisEdge

2

Wenn Ihre Spalten Wert enthält nur 0 und 1 dann Vlad Călin Buzea und scaisEdge Antwort wird für Sie arbeiten. Aber wenn es andere als 0 und 1 haben kann, benötigen Sie dies.

SELECT COUNT(*) 
FROM Table_Name 
WHERE (CASE WHEN col2 = 1 THEN 1 ELSE 0 END) + 
     (CASE WHEN col3 = 1 THEN 1 ELSE 0 END) + 
     (CASE WHEN col4 = 1 THEN 1 ELSE 0 END) = 2 
+0

mit 0 in deinen else Statements würde mehr Standard sein, vor allem, wenn jemand ihre Kriterien erweitern wollte, um mehr als 1> 1 zu sagen – Matt

+0

@Matt, ja Sie haben Recht. Die Antwort wurde aktualisiert. –

2
;WITH cte AS (
    SELECT 'Abe' AS Col1, CAST(1 AS BIT) as Col2, CAST(0 AS BIT) as Col3, CAST(1 AS BIT) AS Col4 
    UNION ALL 
    SELECT 'Bob' AS Col1, CAST(0 AS BIT) as Col2, CAST(1 AS BIT) as Col3, CAST(0 AS BIT) AS Col4 
    UNION ALL 
    SELECT 'Cam' AS Col1, CAST(1 AS BIT) as Col2, CAST(1 AS BIT) as Col3, CAST(1 AS BIT) AS Col4 
    UNION ALL 
    SELECT 'AbeWNull' AS Col1, CAST(1 AS BIT) as Col2, CAST(NULL AS BIT) as Col3, CAST(1 AS BIT) AS Col4 
) 

SELECT * 
FROM 
    cte 
WHERE 
    ISNULL(CAST(Col2 AS INT),0) + ISNULL(Col3,0) + ISNULL(Col4,0) = 2 

Die cte gibt Ihnen einige Testdaten. 2 Dinge. 1 wenn es eine 10 oder bit Spalte ist, können Sie cast/convert zu einem integer oder numeric Datentyp mindestens eine der Spalten oder der Zusatz wird nicht funktionieren. Und ja, ich habe es getestet und musste es tun. Zweitens, wenn Sie nicht mit dem Potenzial eines null umgehen, erhalten Sie möglicherweise nicht die Antwort, die Sie wollen.

Zum Beispiel.

SELECT 1 + NULL + 1 

geben Sie NULL

SUM auf einer Spalte nicht das gleiche ist, und es wird nur die nulls ignorieren, aber nicht während der Zugabe Linie.

+0

Danke für deinen Tipp – eric