2013-09-18 5 views
0

У меня есть db resturant, и мне нужно суммировать общую стоимость всех предметов, проданных отдельно. Так что, если бы я продал гамбургер, у которого есть базовая цена в 10 долларов с беконом, стоимость которого стоит 1,00 долларов, а hambuger (опять же 10 долларов США) с avacado стоимостью 0,50 доллара, мне нужно вернуть 21,50 доллара США. Моя таблица фактура выглядит следующим образом:Подзапрос та же таблица в заявлении select

invoice_num item_num price item_id parent_item_id 
111   hmbg  10.00 guid_1 '' 
111   bacn  1.00 guid_2 guid_2 
112   hmbg  10.00 guid_3 '' 
112   avcd  0.50 guid_4 guid_3 

я могу получить сумму всех родительских элементов, как это:

SELECT item_num, SUM(price) FROM invoices WHERE parent_item_id = '' 

это добавление начинку, что сбивает с толку меня. Я чувствую, что мне нужно добавить подзапрос в СУММ, но я не уверен, как это сделать и ссылаясь на исходный запрос, чтобы использовать item_id.

+2

SQL Server? PostgreSQL? MySQL? –

+2

Доступ, DB2, NoSQL? – Kermit

+2

Oracle? :) csv-файлы –

ответ

1
SELECT item_num, sum(i.price) + sum(nvl(x.ingred_price,0)) 
    FROM invoices i 
LEFT OUTER JOIN 
    (SELECT parent_item_id 
      , sum(price) ingred_price 
      FROM invoices 
     WHERE parent_item_id IS NOT NULL 
     GROUP BY parent_item_id) x 
ON x.parent_item_id = i.item_id 
WHERE i.parent_item_id IS NULL  
GROUP BY item_num 

Вот SQL Fiddle, что подтверждает приведенные выше работы кода. Я использовал Oracle, но вы должны быть в состоянии адаптировать его к любой используемой вами БД.

Успение: у вас не более одного уровня в родительских дочерних отношениях. Например. A может иметь ребенка B, но B не будет иметь других детей.

+0

Не будет ли подзапрос давать значения через счета-фактуры (например, мы оба получаем бекон (!)), И наши гамбургеры будут подсчитываться в подзапросе) – Hogan

+0

@Hogan - Смотрите мои последние изменения и SQL Fiddle. – dcp

+0

Это именно то, что я искал. Спасибо вам за помощь!!! – BinaryDuck

1

Непонятно, основываясь на вашем вопросе (см. Мой комментарий), но, насколько я понимаю, простая группа даст вам то, что вы хотите. Если нет, объясните (в исходном вопросе), почему этот запрос не работает - чего он не хватает из ваших требований?

SELECT item_num, SUM(price) 
FROM invoices 
GROUP BY item_num 
+0

, как этот может вернуть 21,5 в любой строке? –

+0

Мне нужны итоги для всех проданных гамбургеров, включая их начинки (поэтому я не хочу запись для бекона или авокадо) для всех счетов-фактур не только на одном. Прошу прощения, если я не понял. – BinaryDuck

0

Трудно сказать, но похоже, что вам нужно recursive cte. Вот пример для PostgreSQL:

with recursive cte as (
    select 
     t.invoice_num, t.price, t.item_id, t.item_num 
    from Table1 as t 
    where t.parent_item_id is null 
    union all 
    select 
     t.invoice_num, t.price, t.item_id, c.item_num 
    from Table1 as t 
     inner join cte as c on c.item_id = t.parent_item_id 
) 
select invoice_num, item_num, sum(price) 
from cte 
group by invoice_num, item_num 

sql fiddle demo

Я использовал null для пустого parent_item_id (это лучшее решение, чем использование пустых строк), но вы можете изменить это ''.

Смежные вопросы