2015-04-28 4 views
-1

Я работаю над кодом SQL как частью моей университетской работы. Данные являются наглядными, чтобы быть ясными. Я пытаюсь подсчитать события 1 & 0 в таблице SQL Fact_Stream, это сохраняется в столбце/атрибуте Free_Stream как значение Boolean/bit.SQL Процент находок

Поскольку вычисления не могут выполняться по битовым значениям (по крайней мере, так, как я пытаюсь), я преобразовал значение в целое число - просто чтобы это было ясно. В таблице содержится информация о потоках потоковых компаний, 1 указывает, что поток был бесплатным, 0 указывает, что был оплачен поток. Мой код:

SELECT Fact_Stream.Free_Stream, ((CAST(Free_Stream AS INT))/COUNT(*) * 100) As 'Percentage of Streams' 
FROM Fact_Stream 
GROUP BY Free_Stream 

Результат/результат почти там, где я хочу, но он не отображает процент правильно.

Выход:

enter image description here

Использование MS SQL Management Studio | MS SQL Server 2012 (я считаю)

+0

ваше уравнение деления идентификатора (1 или 0) на число потоков для каждого из них, вместо деления кол-во свободных или оплаченных общим счетом –

+0

Привет, спасибо за ваш комментарий @JenR, я понимаю, что вы имеете в виду, но я не знаю, как поместить это в SQL? – user3516240

ответ

2

Процент должен быть основан на все строки, так что вам нужно разделить количество за 1/0 с помощью подсчета всех строк. Самый простой способ получить это с использованием Оконных агрегатной функции:

SELECT Fact_Stream.Free_Stream, 
    100.0 * COUNT(*)  -- count per bit 
/SUM(COUNT(*)) OVER() -- sum of those counts = count of all rows 
    As "Percentage of Streams" 
FROM Fact_Stream 
GROUP BY Free_Stream 
+0

Спасибо @dnoeth! – user3516240

0

У вас есть INT s как devisor и devidened (не уверенный, что я прав, с именами). Таким образом, результат также INT. Просто отбросьте один из них до десятичного (обратите внимание, как я изменился на 100.0). Кроме того, вы должны debide количества элементов в группе к общему количеству строк в таблице:

select Free_Stream, 
     (count(*)/(select count(*) from Free_Stream)) * 100.0 as 'Percentage of Streams' 
from Fact_Stream 
group by Free_Stream 
+0

Это возвращает результат «0.0» вместо «0» .... – user3516240

+0

@ user3516240, произошла еще одна ошибка. Исправленный. –

0

Ваше уравнением делением идентификатора (1 или 0) на число потоков для каждого из них, вместо деления количества свободных или выплаченного общий счет. Один из способов сделать это, чтобы получить общее количество, а затем использовать его в запросе:

declare @totalcount real; 
select @totalcount = count(*) from Fact_Stream; 

SELECT Fact_Stream.Free_Stream, 
    (Cast(Count(*) as real)/@totalcount)*100 AS 'Percentage of Streams' 
FROM Fact_Stream 
group by Fact_Stream.Free_Stream 
Смежные вопросы