Показать количество на основе некоторого условия

Я задал вопрос несколько дней назад. Вот эта ссылка. Count(), соответствующий 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

person harry    schedule 01.04.2013    source источник
comment
Прочитай свой вопрос пару раз. Все еще не понимаю. Определите a project whose status is waiting to be 40. Это может означать несколько вещей.   -  person Erwin Brandstetter    schedule 13.04.2013
comment
@ErwinBrandstetter Хорошо. Я объясню. 10, 20, 30, 40 означает разные уровни одобрения. Чтобы объяснить сценарий, давайте возьмем два статуса. Скажем, 30 как Manager's Approval и 40 как Administrator Approval. Как я объяснил в вопросе, текущий статус будет увеличиваться на 10 каждый раз, когда делается утверждение. Итак, если проект имеет текущий статус 30, это означает, что он прошел Managers Approval и теперь ожидает Administrators Approval. Таким образом, количество, соответствующее Administrators Approval   -  person harry    schedule 13.04.2013
comment
Итак, a project whose status is waiting to be 40 точно такой же, как a project with a maximum status of 30 in table user_approval? Кроме того: вы пишете is about showing the next status of every project, но затем отображаете одну строку для местоположения? Это противоречиво. Пожалуйста, уточните, какие выходные данные вам нужны точно.   -  person Erwin Brandstetter    schedule 14.04.2013


Ответы (3)


Не знаю, что означает 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
  );
person wildplasser    schedule 01.04.2013
comment
Ваше предположение верно. С каждым одобрением статус увеличивается на 10. Я обновил эту информацию в вопросе. - person harry; 01.04.2013
comment
Я ответил на исходный вопрос. Вы можете попробовать реализовать дополнительный PIVOT самостоятельно. - person wildplasser; 01.04.2013

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

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;

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

person Horus    schedule 14.04.2013

select * from user_approval where appr_status
= (select max(appr_status) from user_approval where appr_status < 40);

Скрипт SQL: - http://www.sqlfiddle.com/#!11/f5243/10

person ashutosh raina    schedule 01.04.2013