3

私はレストラン データベースを持っており、個別に販売されたすべてのアイテムの合計値を合計する必要があります。したがって、基本価格が 10.00 ドルのハンバーガーにベーコンが 1.00 ドル、アバカドが 0.50 ドルのハンバーガー (再び 10.00 ドル) を販売した場合、21.50 ドルを返品する必要があります。私の請求表は次のようになります。

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 = ''

私を混乱させているのはトッピングの追加です。SUM にサブクエリを追加する必要があるように感じますが、それを行う方法と元のクエリを参照して item_id を使用する方法がわかりません。

4

3 に答える 3

3
 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 を使用しましたが、使用しているどの DB にも適応できるはずです。

前提: 親子関係に複数のレベルはありません。たとえば、A は子 B を持つことができますが、B には他の子はありません。

于 2013-09-18T16:59:23.170 に答える
1

あなたの質問に基づいて明確ではありません(私のコメントを参照してください)が、私が理解しているように、単純なグループ化により、必要なものが得られます。そうでない場合は、(元の質問で) なぜこのクエリが機能しないのかを説明してください --- 要件に欠けているものは何ですか?

SELECT item_num, SUM(price) 
FROM invoices
GROUP BY item_num
于 2013-09-18T17:03:49.873 に答える
0

言うのは難しいですが、再帰的な 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(空の文字列を使用するよりも良い解決策です)が、これをに変更できます''

于 2013-09-18T17:10:00.073 に答える