mysql - выберите с учетом приоритета - PullRequest
1 голос
/ 20 сентября 2019

У меня есть две таблицы

table1

| a_id  | a_name  |
+-------+---------+
|   1   |  foo    |
|   2   |  bar    |
|   3   |  joe    |
|   4   |  jhon   |

table2

| b_id  | a_id |  b_exec |
+-------+------+---------+
|   1   |   1  |    2    |
|   2   |   1  |    1    |
|   3   |   1  |    0    |
|   4   |   2  |    2    |
|   5   |   2  |    0    |
|   6   |   3  |    2    |

Я хотел бы получить представление с b_exec_level.
Логика b_exec_level должна быть такой.
Присвоение приоритета 1, затем 0 изатем 2
Если существует 1 в b_exec, exec_level должен быть 1
Если существует 0 и не существует 1 в b_exec, exec_level должен быть 0
Если 1 или 0 не существует, exec_level должен быть 2.

Результат должен быть таким:

view

| a_id | a_nome | b_exec_level |
+------+--------+--------------+
|  1   |  foo   |      1       |
|  2   |  bar   |      0       |
|  3   |  joe   |      2       |
|  4   |  jhon  |      2       |

Я пытался использовать CASE таким образом

select
t1.a_id,
t1.a_name,
( case when ( t2.b_exex = 0) then 0
       when ( t2.b_exex = 1) then 1 else 2 end) AS b_exec_level
from ( table1 t1 left join table2 t2 on( (t1.a_id = t2.a_id) ) )
group by t1.a_id;

, но результат зависит от порядка, в котором они являются данными в t1.b_exec, если он был вставлен до значения 1 или 0.

Вы можете каким-то образом это сделать?Спасибо

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Вы на правильном пути;Одним из способов является использование фильтрации на основе условного агрегирования.sum(t2.b_exec = 1) будет считаться, когда есть хотя бы одна строка для b_exec = 1.Аналогично для других случаев, как показано ниже:

select
t1.a_id,
t1.a_name,
( case when sum(t2.b_exec = 1) then 1 
       when sum(t2.b_exec = 0) then 0 
       else 2
  end ) AS b_exec_level
from ( table1 t1 left join table2 t2 on( (t1.a_id = t2.a_id) ) )
group by t1.a_id, t1.a_name;
0 голосов
/ 20 сентября 2019

Попробуйте запрос ниже:

declare @tbl table(a_id int, b_exec int);
insert into @tbl values
(1, 2),
(1, 1),
(1, 0),
(2, 2),
(2, 0),
(3, 2);

select a_id,
       -- here we check existence of particular numbers and assign levels
       case when exist1 = 1 then 1 else
         case when exist0 = 1 then 0 else 2 end
       end b_exec_level
from (
    select a_id
           , max(case when b_exec = 0 then 1 else 0 end) exist0
           , max(case when b_exec = 1 then 1 else 0 end) exist1
           , max(case when b_exec = 2 then 1 else 0 end) exist2
    from @tbl
    group by a_id
) a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...