Я пытаюсь получить все эти «числа» из данной таблицы, где «OUT»> «IN»

У нас может быть несколько записей для одного значения «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

Спасибо

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте условную агрегацию:

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);

Спасибо за решение, можем ли мы использовать другой подход, отличный от оператора CASE.

rahul kushwaha 03.05.2022 02:48

@rahulkushwaha, что не так с выражением падежа? (это не заявление).

Dale K 03.05.2022 02:56

Ничего страшного, работает идеально. Я пытался решить это с помощью соединений/подзапросов или объединения, никогда не заботясь о CASE. Спасибо за решение.

rahul kushwaha 03.05.2022 02:58
Ответ принят как подходящий

Я бы использовал агрегатную функцию условия в подзапросе и добавил, где 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

sqlfiddle

Спасибо за решение, я хотел знать, можем ли мы обычным способом решить такие проблемы, когда нам нужно сгруппировать похожие значения, присутствующие в одном столбце. Или мы можем следовать и другому подходу. Можете ли вы предложить изменения в моем подходе.

rahul kushwaha 03.05.2022 02:44

@rahulkushwaha почему тебя волнует подход? Ведь целью является получение правильных результатов?

Dale K 03.05.2022 02:56

Да, это правда. Спасибо за быстрый ответ.

rahul kushwaha 03.05.2022 03:00

Привет даунвотер. зачем минусовать меня? это может работать на dbfiddle.uk/…

D-Shih 03.05.2022 03:02

^^^ согласен - очень странно

Dale K 03.05.2022 03:04

Подзапрос здесь не нужен, и его можно избежать.

Tim Biegeleisen 03.05.2022 08:06

Другие вопросы по теме