2016-08-25 3 views
-4

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

Например, вот как выглядит таблица

ID | State 
-----+----------------  
12 | Not Accepted 
12 | Not Accepted 
12 | Accepted 
45 | Not Accepted 
67 | Not Accepted 

Теперь я хочу, чтобы рассчитывать различные идентификаторы Into принимаются и не принимаются ведер.

Если id достигнут принятого состояния, то он должен учитываться в ведомости accepted (игнорируя тот факт, что он ранее не принимал состояния). Пример для id = 12 имеет 2 не принимаемых состояния и 1 принимаемое состояние, поэтому нужно увеличивать счет accepted.

Ожидаемый результат

Accepted | Not Accepted 
---------+-------------- 
    1 |  2 

Я попытался это SQL заявление, но это не дает мне правильный результат

SELECT 
    SUM(CASE WHEN state = 'Accepted' THEN 1 ELSE 0 END) AS accepted, 
    SUM(CASE WHEN state != 'Accepted' THEN 1 ELSE 0 END) AS nonaccepted 
FROM 
    SAMPLE; 

результаты, которые я получаю:

Accepted | Not Accepted 
---------+------------- 
    1 |  4 
+0

1) Совершенно неясно, о чем вы спрашиваете. Пожалуйста, опубликуйте SQL, который вы попытались сделать сами, включите результаты, которые вы получаете от этого запроса, и более четко сформулируйте проблему. 2) Пока вы делаете это [править], улучшите свой заголовок, чтобы указать проблему или вопрос, о которых вы спрашиваете. Если вы удалите информацию тега (SQL и Oracle), которая является избыточной, она оставляет * Basic *, которая имеет нулевое значение или значение. В вашем названии должно быть четко указано проблема, с которой вы сталкиваетесь, или вопрос, который вы задаете, и должен иметь смысл для будущих читателей, которые видят его в наборе результатов поиска. См. [Ask]. –

+0

Вы чемпион, Вик! Я отредактировал ваше сообщение, чтобы отформатировать его правильно. Я вижу, что вы снова отредактировали, чтобы удалить форматирование. Хорошо, что вы мат! – mathguy

+0

Простите @mathguy, я не собирался удалять ваше форматирование, я уже был в режиме редактирования, чтобы сделать его более разумным. –

ответ

2

Не уверен, что именно вы просите, но я думаю, что вы этого хотите:

select sum(case when min_state = 'Accepted' then 1 else 0 end) accepted_cnt, 
     sum(case when min_state = 'Not Accepted' then 1 else 0 end) not_accepted_cnt 
from (select id, min(state) min_state 
     from my_table 
     group by id); 
+0

спасибо @Art Trifonov –

Смежные вопросы