2015-08-27 2 views
5

Я пытаюсь использовать SEDE, чтобы определить, сколько значков на основе тегов было присуждено в общей сложности. Моя типичная стратегия просуммировать:Как я могу получить количество столбцов бит-типа?

select sum(TagBased) 
from Badges 

К сожалению, так как TagBased немного значение, я получаю эту ошибку:

Operand data type bit is invalid for sum operator.

Из отчаяния, я попытался подсчет:

select count(TagBased) 
from Badges 

Это подсчитывает количество ненулевых значений, которое в этом случае идентично count(*). Итак, как можно использовать значение бит в совокупности?

ответ

10

Если вы просто хотите взглянуть на основе меток значки и не заботятся об отдыхе, вы можете переместить тест где положение:

select count(*) 
from Badges 
where TagBased = 1 

Каноническое решение было бы бросить битовое значение в тип данных, которые могут быть суммированы:

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

еще более гибкое решение, чтобы сделать преобразование себя с CASE statement:

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

Кроме того, в новых версиях SQL Server есть более IIF function:

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

Наконец, если вы играть в гольф, вы можете обмануть SQL в преобразовании бит для вас:

select sum(TagBased+0) 
from Badges 

кредит для этой техники переходит на ответ Kenneth Baltrinic на более конкретный вопрос.

Для справки (и потенциального разветвления): my test queries.

+0

возможно вы можете добавить это тоже 'select sum (TagBased & 1) из Badges'? – Saidolim

+0

Я никогда не был на http://data.stackexchange.com, пока не увидел вашу последнюю ссылку - теперь я чувствую, что остальная часть моего вечера испарится ... – TwoStraws

1

Другой метод COUNT только один из BIT колонны является использование NULLIF:

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

LiveDemo


Еще один способ с использованием SIGN:

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

LiveDemo2


И еще один способ.Я не знаю, почему я написал:

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

LiveDemo3

1

Один из способов с использованием битовых операторов.

select sum(TagBased&1) from Badges 

Как правило, вы можете хранить несколько битовых значений в одном целых числах. Например, у меня есть 5 типов багов. Вы можете поставить значения как:

  • 1 - Кодекс
  • 2 - битном
  • 4 - байты
  • 8 - программируют

, если вам нужно установить Code и byte в том же время. Это будет 1 + 4 = 5

Теперь, как посчитать кол Code Бажа

select sum(TagBased & 1) from Badges 

Теперь, как посчитать кол Byte Бажа

select sum(TagBased & 4)/4 from Badges 

Теперь в то же время, Code и Byte Бажа рассчитывать на всех

select count(TagBased & 5) from Badges where TagBased & 5 > 0 
Смежные вопросы