У нас может быть несколько записей для одного значения «num». Нам нужно напечатать вывод в порядке возрастания числа.
Таблица :
create table bill
(
type varchar(5),
num varchar(12),
dur int
);
insert into bill values
('OUT',1818,13),
('IN', 1818,10),
('OUT',1818,7),
('OUT',1817,15),
('IN',1817,18),
('IN',1819,18),
('OUT',1819,40),
('IN',1819,18)
Вот что я запрашиваю: я группирую записи по «типу» в разных подзапросах и извлекаю записи, где «OUT»> «IN».
select a.num
from
(select num,sum(dur) as D
from bill
where type ='OUT'
group by num) a ,
(select num,sum(dur) as D
from bill
where type ='IN'
group by num) b
where a.D > b.D
group by a.num
order by 1
My output: Expected output:
num num
1817 1818
1818 1819
1819
Спасибо
Используйте условную агрегацию:
SELECT num
FROM bill
GROUP BY num
HAVING SUM(CASE WHEN type = 'OUT' THEN dur ELSE 0 END) >
SUM(CASE WHEN type = 'IN' THEN dur ELSE 0 END);
@rahulkushwaha, что не так с выражением падежа? (это не заявление).
Ничего страшного, работает идеально. Я пытался решить это с помощью соединений/подзапросов или объединения, никогда не заботясь о CASE. Спасибо за решение.
Я бы использовал агрегатную функцию условия в подзапросе и добавил, где type in ('IN','OUT')
, что могло бы повысить производительность, если бы вы создали индекс для type
в первом столбце
SELECT num
FROM (
SELECT num,
SUM(CASE WHEN type = 'OUT' THEN dur ELSE 0 END) outval,
SUM(CASE WHEN type = 'IN' THEN dur ELSE 0 END) inval
FROM bill
WHERE type in ('IN','OUT')
GROUP BY num
) t1
WHERE outval > inval
Спасибо за решение, я хотел знать, можем ли мы обычным способом решить такие проблемы, когда нам нужно сгруппировать похожие значения, присутствующие в одном столбце. Или мы можем следовать и другому подходу. Можете ли вы предложить изменения в моем подходе.
@rahulkushwaha почему тебя волнует подход? Ведь целью является получение правильных результатов?
Да, это правда. Спасибо за быстрый ответ.
Привет даунвотер. зачем минусовать меня? это может работать на dbfiddle.uk/…
^^^ согласен - очень странно
Подзапрос здесь не нужен, и его можно избежать.
Спасибо за решение, можем ли мы использовать другой подход, отличный от оператора CASE.