2017-02-09 7 views
1

Как получить отдельный счетчик столбца в зависимости от значения другого столбца?Как получить отдельный счет столбца, основанный на значении другого столбца

Я мог понять, что этого можно добиться, создав другую промежуточную таблицу, но я запускаю этот запрос в таблице с миллиардами строк, поэтому было бы лучше, если бы мы могли получить результат в одном запросе, а не создавать другую группу.

Вот образец кода для тестирования.

CREATE TABLE MYGROUP (Category,PERSON,Flag) AS 
      SELECT 'Cat1','A','1' FROM DUAL 
UNION ALL SELECT 'Cat1','A','0' FROM DUAL 
UNION ALL SELECT 'Cat1','A','1' FROM DUAL 
UNION ALL SELECT 'Cat1','B','1' FROM DUAL 
UNION ALL SELECT 'Cat1','B','0' FROM DUAL 
UNION ALL SELECT 'Cat2','A','0' FROM DUAL 
UNION ALL SELECT 'Cat2','A','0' FROM DUAL 
UNION ALL SELECT 'Cat2','A','0' FROM DUAL 
UNION ALL SELECT 'Cat2','B','1' FROM DUAL 
UNION ALL SELECT 'Cat2','B','1' FROM DUAL 
UNION ALL SELECT 'Cat2','B','0' FROM DUAL 
UNION ALL SELECT 'Cat3','X','0' FROM DUAL 
UNION ALL SELECT 'Cat3','Y','0' FROM DUAL; 

Желаемый выход:

Category Count of Distinct Persons with Flag =1 
Cat1  2 
Cat2  1 
Cat3  0 

Причина выхода Там как A и B, с флагом = 1, поэтому рассчитывать 2 в первой строке и Существует только Б с флагом = 1, поэтому рассчитывать является 1 во второй строке подсчета Cat3 равно 0, поскольку нет ни в одной строке с флагом = 1

+0

Вы перечислили почти все базы данных там; какой из них вы фактически используете? –

+0

Его для оракула, добавил других, так как он может быть похож на других. – Thunder

+1

Нет, ответ, который вы приняли, не будет работать на MySQL вообще, а также не будет работать на SQL Server, поскольку он не имеет функции 'DECODE()'. В будущем просто пометьте свою фактическую базу данных. –

ответ

1

Использование count(distinct decode(flag,1,person,null))

Это будет игнорировать лиц, где флаг не равен "1" и будет работать быстрее

select category ,count (distinct decode(flag,1,person,null)) countof from MYGROUP 
group by category 

Или Вы можете использование аналитической функции Over (partition by) статья

В общих аналитических функциях работает быстрее. Вот пример того, как можно применить аналитическую функцию на этот вопрос:

select distinct category ,count (distinct decode(flag,1,person,null)) over (partition by category) countof from MYGROUP 

Посмотрите на план выполнения и выбрать Что лучше для вас

+0

'и будет работать быстрее' ... Я сомневаюсь, что это будет быстрее, чем предложение WHERE, если индексируется столбец« Flag ». –

+0

Может быть, мы можем видеть это на плане исполнения –

+0

Удивительное решение, первое решение показалось мне более понятным Спасибо !, Я думаю, что отличное ключевое слово во втором решении делает его немного неэффективным, чем первый. – Thunder

2

Применение COUNT(DISTINCT PERSON):

SELECT Category, 
     COUNT(DISTINCT CASE WHEN Flag = 1 THEN PERSON END) AS distinct_count 
FROM MYGROUP 
GROUP BY Category 

Демо здесь:

SQLFiddle