Выдать перечень книг, имеющихся в наличии, указав их количество, цену. SQL

Задача: Выдать перечень книг, имеющихся в наличии, указав их количество, цену

Проблема в использовании подзапроса, а именно где его нужно использовать и как? Как убрать дублирование записей и найти общую для записи разность сумм двух таблиц?

Даны таблицы 4 таблицы (1 не нужна для решения задачи):

BooksArrive - IdBookArrive, IdKnowledgeArea, CatalogIndex, Count, ArriveDate

BooksSales - IdSale, IdKnowledgeArea, CatalogIndex, Count, SellingPrice, SellDate

Books - CatalogIndex, IdKnowledgeArea, Authors, Name, ReleaseDate, Cost

Select b.Name, b.Cost, (ba."Count" - SUM(bs."Count")) as Remain
From BooksSales as bs, Books as b, BooksArrive as ba
Where (bs.CatalogIndex = b.CatalogIndex) AND (ba.CatalogIndex = b.CatalogIndex) AND ((ba."Count" - bs."Count") > 0)
GROUP BY b.Name,  b.Cost, ba."Count"

пример неправильной работы запроса

![таблица BooksSales

Таблица BooksArrive


Ответы (1 шт):

Автор решения: CrazyElf

Не совсем ещё ответ, поскольку задача так и не сформулирована чётко, но руководство к действию:

SELECT bb.Name, r.Remain 
FROM Books bb
JOIN (SELECT b.CatalogIndex, 
       SUM(ISNULL(ba."Count", 0)) - SUM(ISNULL(bs."Count", 0)) as Remain
      FROM Books as b
      LEFT JOIN BooksArrive as ba ON ba.CatalogIndex = b.CatalogIndex
      LEFT JOIN BooksSales  as bs ON bs.CatalogIndex = b.CatalogIndex
      GROUP BY b.CatalogIndex
) r ON r.CatalogIndex = bb.CatalogIndex

Суть:

  • Группируем книги только по CatalogIndex, по количеству не нужно, а название и цена теоретически могут совпасть у разных книг
  • Соединять таблицы лучше через JOIN ... ON, так гораздо нагляднее
  • Опять же LEFT JOIN + ISNULL позволят правильно обработать ситуацию, когда по каким-то книгам не было завоза или продаж

Последнюю цену продажи можно получить отдельным подзапросом либо с использованием оконной функции, либо сгруппировать продажи по книгам, взять максимальный id продажи по каждой группе, потом присоединить продажи с этими id и взять из них цену продажи. Возможно, это как-то проще делается, я так сходу не соображу.

→ Ссылка