Ich muss eine Abfrage erstellen, die die Anzahl von True (1) und False (0) in zwei separate Spalten aus einem Bitfeld summiert.
Ich schließe mich an drei Tischen an und brauche etwas, um so zu sein:
Attribut | Klasse | Pass | Scheitern
Ich werde nach Attribut und Klasse gruppieren.
Etwas wie das:
SUM(CASE WHEN ColumnName = 1 THEN 1 ELSE 0 END) AS Pass,
SUM(CASE WHEN ColumnName = 0 THEN 1 ELSE 0 END) AS Fail
Das funktioniert (zumindest in SQL 2008)
SELECT SUM(Passed + 0) PASS , SUM(1 - Passed) FAIL
Ich addiere 0 zu Passed in der ersten Summe als eine kurze Handmethode zum Konvertieren von Bit in Int, da Sie Bits nicht direkt summieren können.
SELECT
Attribute,
Class,
SUM(CASE BitField WHEN 1 THEN 1 ELSE 0 END) AS [Pass],
SUM(CASE BitField WHEN 0 THEN 1 ELSE 0 END) AS [Fail]
FROM
Table
GROUP BY
Attribute,
Class
versuchen:
declare @table table (columnName bit)
insert into @table values (1)
insert into @table values (1)
insert into @table values (1)
insert into @table values (1)
insert into @table values (1)
insert into @table values (0)
insert into @table values (0)
insert into @table values (0)
insert into @table values (0)
SELECT
SUM(CASE WHEN ColumnName = 1 THEN 1 ELSE 0 END) AS True1
, SUM(CASE WHEN ColumnName = 0 THEN 1 ELSE 0 END ) AS False0
from @Table
AUSGABE:
True1 False0
----------- -----------
5 4
(1 row(s) affected)
Eine andere Option wäre
SELECT Attribute, Class
COUNT(CASE WHEN ColumnName = 1 THEN 1 END) Pass,
COUNT(CASE WHEN ColumnName = 0 THEN 1 END) Fail FROM YourTable
GROUP BY Attribute, Class
es gibt noch eine weitere Option:
SELECT
Attribute,
Class,
COUNT(BoolColumnName = 1 or NULL) Pass,
COUNT(BoolColumnName = 0 or NULL) Fail
FROM Table
GROUP BY Attribute, Class