DB2 с использованием CASE с AND внутри суммы - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть несколько строк в запросе выбора на db2, которые используют CASE с AND внутри функции sum. Это хорошо работает на MySQL, но больше не работает из-за 'И'.

Разве я не могу использовать это ключевое слово вместе с заявлением о регистре? Я пытаюсь объединить эти вещи в единое целое и не могу найти прямого решения IBM для этого.

Оригинальный запрос:

select  
    sum(case when legtype1 = 2 then 1 else 0 end and answered = 1) as total_inbound
    , sum(case when legtype1 = 2 then 1 else 0 end and answered = 0) as total_missed
    , ROUND(COALESCE(100.00 * sum(case when legtype1 = 2 and answered = 1 then 1 end)/
        sum(case when legtype1 = 2 then 1 end), 100),2) as percent_answered

from table1;

Я пробовал

 sum(case when legtype1 = 2 then 1 else 0 end, case when answered = 1 then 1 else 0 end)

Но это тоже не правильно. Мне нужно суммировать на основе выполнения обоих условий. Есть ли другой путь, по которому я должен поступить в DB2? Я бы подумал, что можно было бы создать псевдонимы для каждого условия, но я еще ничего не нашел.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Из интереса, вы можете суммировать BOOLEAN значения с Db2 11.1.2.2

drop  table table1;
create table table1(legtype1 int, answered int);
insert into table1 values (2,1),(2,1),(null, null),(2,0);
select
    sum(legtype1 = 2 and answered = 1) as total_inbound
,   sum(legtype1 = 2 and answered = 0) as total_missed
from table1;

 TOTAL_INBOUND TOTAL_MISSED
 ------------- ------------
             2            1
0 голосов
/ 05 ноября 2018

Я думаю, что DB / 2 более строг в своих условных выражениях, не позволяя вам AND, int и условных, и рассматривает результат как аргумент SUM. По сути, речь идет не о AND - вы должны увидеть ту же проблему, если попытаетесь суммировать логические значения, например SUM(answered = 1)

Вы должны иметь возможность вставить AND в выражение CASE, например:

select  
    sum(case when legtype1 = 2 and answered = 1 then 1 else 0 end) as total_inbound
,   sum(case when legtype1 = 2 and answered = 0 then 1 else 0 end) as total_missed
,   ROUND(COALESCE(100.00 * sum(case when legtype1 = 2 and answered = 1 then 1 end)/
    sum(case when legtype1 = 2 then 1 end), 100),2) as percent_answered

from table1;
...