2013-03-28 3 views
4

у меня есть следующие таблицы:отсчет(), соответствующий макс() различных значений, удовлетворяющих некоторому условию

user_group

usergrp_id  bigint  Primary Key 
usergrp_name text 

пользователя

user_id    bigint  Primary Key 
user_name   text 
user_usergrp_id  bigint 
user_loc_id   bigint 

user_usergrp_id имеет соответствующее i d из таблицы user_group user_loc_id имеет свой идентификатор id (branch_id) из таблицы ветвей.

филиал

branch_id  bigint  Primary Key 
branch_name text 
branch_type smallint 

branch_type По умолчанию устанавливается равным 1. Хотя может содержать любое значение в диапазоне от 1 до 4.

user_projects

proj_id   bigint  Primary Key 
proj_name  text 
proj_branch_id smallint 

proj_branch_id имеет его соответствующий id (branch_id) со вкладки ветки ле.

user_approval

appr_id   bigint  Primary Key 
appr_prjt_id  bigint 
appr_status  smallint 
appr_approval_by bigint 

appr_approval_by имеет соответствующий идентификатор (user_id) из пользовательской таблицы
appr_status могут содержать различные значения состояния, как 10,20,30 ... для одного appr_prjt_id

user_group

usergrp_id | usergrp_name 
------------------------- 
    1  | Admin 
    2  | Manager 

пользователь

user_id | user_name | user_usergrp_id |user_loc_id 
--------------------------------------------------- 
    1 | John  |  1   |  1 
    2 | Harry  |  2   |  1 

филиал

branch_id | branch_name | branch_type 
------------------------------------- 
    1  | location1 | 2 
    2  | location2 | 1 
    3  | location3 | 4 
    4  | location4 | 2 
    5  | location4 | 2 

user_projects

proj_id | proj_name | proj_branch_id 
------------------------------------ 
    1 | test1  |  1 
    2 | test2  |  2 
    3 | test3  |  1 
    4 | test4  |  3 
    5 | test5  |  1 
    6 | test5  |  4 

user_approval

appr_id | appr_prjt_id | appr_status | appr_approval_by 
------------------------------------------------------- 
    1 | 1   |  10  |  1 
    2 | 1   |  20  |  1 
    3 | 1   |  30  |  1 
    4 | 2   |  10  |  2 
    5 | 3   |  10  |  1 
    6 | 3   |  20  |  2 
    7 | 4   |  10  |  1 
    8 | 4   |  20  |  1 

Состояние: Выход должен принимать значение appr_statusMAX() для каждого appr_prjt_id и считать.

I.e., в приведенной выше таблице appr_prjt_id=1 имеет 3 различных статуса: 10, 20, 30.Его счет должен отображаться только для статуса, соответствующего 30 на выходе (не в статусах 10 и 20), соответствующих группе пользователей в определенном branch_name. Точно так же для каждого другого идентификаторы в области appr_prjt_id

SQL Fiddle

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

      10 | 20 | 30 

     ------> Admin  0 | 1 | 1 
     | 
location1 
     | 
     ------> Manager 1 | 1 | 0 

Как я могу это сделать?

SQL Fiddle

ответ

2

SQL Fiddle

select 
    branch_name, usergrp_name, 
    sum((appr_status = 10)::integer) "10", 
    sum((appr_status = 20)::integer) "20", 
    sum((appr_status = 30)::integer) "30" 
from 
    (
     select distinct on (appr_prjt_id) 
      appr_prjt_id, appr_approval_by, appr_status 
     from user_approval 
     order by 1, 3 desc 
    ) ua 
    inner join 
    users u on ua.appr_approval_by = u.user_id 
    inner join 
    user_group ug on u.user_usergrp_id = ug.usergrp_id 
    inner join 
    branch b on u.user_loc_id = b.branch_id 
group by branch_name, usergrp_name 
order by usergrp_name 

Классическое решение, которое работает в большинстве СУБД является использование case:

select 
    branch_name, usergrp_name, 
    sum(case appr_status when 10 then 1 else 0 end) "10", 

Но Postgresql имеет логический тип и имеет оттенок на целое число (boolean::integer), что приводит к 0 или 1, что делает для менее подробный код.

В этом случае также можно сделать count в вместо sum:

select 
    branch_name, usergrp_name, 
    count(appr_status = 10 or null) "10", 

Я действительно предпочитаю count, но у меня сложилось впечатление, что это труднее понять. Хитрость заключается в том, чтобы знать, что count подсчитывает что-либо не null и что (true или null) является true и (false или null) является нулевым, поэтому он будет подсчитывать, когда условие истинно.

+0

Что это за часть: 'порядок от 1, 3 desc'? – saji89

+0

@saji Это означает заказ по 1-му столбцу выбора, затем на 3-й –

+0

. Спасибо за эту информацию. – saji89

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