Выдать перечень книг, имеющихся в наличии, указав их количество, цену. 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"
Ответы (1 шт):
Не совсем ещё ответ, поскольку задача так и не сформулирована чётко, но руководство к действию:
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 и взять из них цену продажи. Возможно, это как-то проще делается, я так сходу не соображу.