2009-07-14 3 views
9

У меня есть следующий запрос, который пытается выяснить процентное соотношение определенного продукта по сравнению с общим количеством продуктов. IE: [Количество продукта]/[Всего товаров] = ПроцентSQL Divide by Two Count()

;WITH totalCount AS(
    SELECT 
     CAST(COUNT(id) as Integer)as totalCount 
    FROM TABLE_NAME 
) 
SELECT 
    ((CAST(COUNT(DISTINCT id) as Integer)/(SELECT * FROM totalCount))*100) as 'Percent' 
FROM TABLE_NAME 

Однако столбец процентов всегда возвращает "0", если не будет только одна запись. Кроме того, есть ли способ добавить запрос totalCount и Select в один?

В принципе, как вы разделите два поля Count()?

ответ

9

Включить общее число как число, кроме целого числа (DECIMAL?) - математика округляется.

+1

Спасибо, что сработало! Это всегда простые вещи, которые вы получаете. – Jefe

+2

Не забудьте прокомментировать этот код. Следующий разработчик может быть не таким умным, как вы. –

+0

@Matthew: БОЛЬШОЕ ПРЕДЛОЖЕНИЕ! – n8wrl

2

Это не должно быть:

;WITH totalCount AS(
    SELECT 
     CAST(COUNT(id) as Integer)as totalCount 
    FROM TABLE_NAME 
) 
SELECT 
    ((CAST(COUNT(DISTINCT id) as Integer)*100/(SELECT count(*) FROM totalCount))) as 'Percent' 
FROM TABLE_NAME 

Обратите внимание на SELECT COUNT (*). Кроме того, вы должны размножаться, прежде чем делиться, в противном случае вы всегда будете получать нуль

+0

Я так не думаю, так как запрос totalCount возвращает только одну строку, поэтому, если вы добавите в COUNT (*), он всегда будет возвращать 1, вместо фактического итога. Спасибо за помощь, хотя :) – Jefe

+0

okay :-) Но умножение на 100, безусловно, решит вашу проблему. –

5

Кастинг как нечто с десятичной точностью, а не целое. Поплавок или реальный.

select cast(distinctCount as real)/cast(totalCount as real) * 100.00 
    , distinctCount 
    , totalCount 
from (
select count(distinct id) as distinctCount 
    , count(id) as totalCount 
    from Table) as aggregatedTable 
+0

Спасибо, что показал мне, как присоединиться к двум запросам в одном. – Jefe

+0

@Jefe: как насчет +1 тогда? lol –

+1

use decimal никогда не использует float или real в математическом вычислении, поскольку они являются неточными типами данных и могут вводить ошибки округления. – HLGEM