2013-04-01 7 views
1

Я задал вопрос несколько дней назад. Вот эта ссылка. Count() corresponding to max()Показать кол-во записей на основе некоторых условий

Теперь с тем же набором таблиц (SQL Fiddle) Я хотел бы проверить различные условия

Если первый вопрос был о счете, связанном с максами статуса, этот вопрос о показе графа на основе на следующий статус каждого проекта.

Объяснение

Как вы можете видеть в таблице user_approval, appr_prjt_id = 1 имеет 3 различные статусы, а именно 10,20, 30. И следующий статус будет 40 (при каждом одобрении статус увеличивается на 10) и так далее. Так можно ли показать, что есть проект, чей статус ожидает 40? Его подсчет должен быть показан только для состояния, соответствующего 40 на выходе (не в статусах 10,20,30, ... и т.д.)

Желаемая Выход:

   10 | 20 | 30 | 40 

location1  0 | 0 | 0 | 1 
+0

Прочтите свой вопрос пару раз. Все еще не понимаю. Определите 'проект, статус которого ожидает 40'. Это может означать пару вещей. –

+0

@ErwinBrandstetter Хорошо. Я объясню. 10,20,30,40 означает разные уровни согласований. Чтобы объяснить сценарий, можно взять два состояния. Допустим, что 30 - «Утверждение менеджера» и 40 - «Утверждение администратора». Как я объяснил в вопросе, текущий статус будет увеличиваться на 10 каждый раз, когда будет получено одобрение. Итак, если у проекта текущий статус 30, это означает, что он прошел «Утверждение менеджеров», и теперь он ждет «Утверждения администраторов». Итак, подсчет соответствует «Утверждению администраторов» – harry

+0

Итак, 'проект, состояние которого ожидает 40, является точно таким же, как« проект с максимальным статусом 30 в таблице user_approval'? Кроме того: вы пишете, что это «показывает следующий статус каждого проекта», но затем вы показываете одну строку для * местоположения *? Это противоречиво. Пожалуйста, уточните, какой результат вам нужен * точно *. –

ответ

1

Не уверен, что такое the next status will be 40. Но если предположить, что состояние увеличивается на 10 с каждым утверждением, следующие должен работать:

SELECT * 
FROM user_projects pr 
WHERE EXISTS (
    SELECT * FROM user_approval ex 
    WHERE ex.appr_prjt_id = pr.proj_id 
    AND ex.appr_status = 30 
) 
AND NOT EXISTS (
    SELECT * FROM user_approval nx 
    WHERE nx.appr_prjt_id = pr.proj_id 
    AND nx.appr_status >= 40 
); 
+0

Ваше предположение верно. При каждом утверждении статус увеличивается на 10. Я обновил эту информацию в вопросе – harry

+0

См. Отредактированный вопрос. – harry

+0

Я задал оригинальный вопрос. Вы могли бы попытаться реализовать дополнительный PIVOT самостоятельно. – wildplasser

1

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

select 
    sum(case when ua.appr_status = 10 then 1 else 0 end) as app_waiting_20, 
    sum(case when ua.appr_status = 20 then 1 else 0 end) as app_waiting_30, 
    sum(case when ua.appr_status = 30 then 1 else 0 end) as app_waiting_40 
from 
    user_approval ua; 

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