У меня есть 3 таблицы: order_items, invoice_items и счета-фактуры
В модели order_items:
has_many :invoice_items
PS order_item может иметь или не иметь какие-либо элементы счета-фактурыс ним
в модели Invoices:
has_many :invoice_items
в модели InvoiceItem
belongs_to :order_item
belongs_to :invoice
таблица order_items содержит booked_quantity
и cancelled_quantity
полей в ней
таблица счетов содержит поле state
.state
можно отменить или утвердить
Таблица invoice_items содержит поле quantity
.
Элемент заказа считается фактурированным, если выполняется следующее условие:
(booked_quantity - cancelled_quantity - SUM (invoice_items.quantity, где связанный счет не отменен))> 0
Я пытаюсь получить все элементы заказа, которые выставляются для выставления счета, с помощью одного запроса sql.Вот два решения, которые я попробовал:
Решение 1:
SELECT * FROM order_items
LEFT OUTER JOIN invoice_items ON invoice_items.order_item_id = order_items.id
INNER JOIN invoices ON invoices.id = invoice_items.invoice_id
WHERE invoices.state != 'cancelled'
GROUP BY order_items.id
HAVING ((booked_quantity - cancelled_quantity - COALESCE(SUM(invoice_items.quantity))) > 0)
ORDER BY order_items.id ASC
Решение 2:
(
WITH ii_ord_items AS
(
SELECT invoice_items.order_item_id, COALESCE(SUM(invoice_items.quantity), 0) AS uncancelled_invoiced_quantity from order_items
LEFT OUTER JOIN invoice_items ON invoice_items.order_item_id = order_items.id
INNER JOIN invoices ON invoices.id = invoice_items.invoice_id
WHERE invoices.state != 'cancelled'
GROUP BY invoice_items.order_item_id
)
SELECT order_items.* FROM order_items
LEFT OUTER JOIN ii_oitems ON order_items.id = ii_oitems.order_item_id
WHERE ( ii_ord_items.uncancelled_invoiced_quantity < (order_items.booked_quantity - order_items.cancelled_quantity))
) AS order_items
Они оба работают нормально, если счет не находится в отмененном состоянии.Но в случае отмены счета они оба дают неверные результаты.Кажется, они также рассматривают количество отмененных счетов.Так что я думаю, что есть некоторая проблема с условием where, но я не мог понять, в чем именно проблема.Любая помощь будет оценена.Заранее спасибо !!
Пример данных:
таблица order_items
id booked_quantity cancelled_quantity
1 10 2
таблица счетов
id state
1 cancelled
таблица invoice_items
id invoice_id order_item_id quantity
1 1 1 8
Ожидаемый результат: Если я попытаюсь выбрать все элементы заказа, для которых invoice_items может бытьсгенерированный должен включать order_item с идентификатором 1, а счет в настоящее время отменен.Если состояние счета-фактуры было бы чем-то иным, чем «отменено», то order_item с идентификатором 1 не должно присутствовать в результате.