0

同様のデータを 1 つの列にグループ化できるクエリを探しています。基本的に、注文アイテムを表すテーブルがあります。各注文項目は注文に属します。注文アイテムには、金額、単位あたりの価格 (ppu)、ppu の通貨 (cur)、およびその他のコスト (それぞれの通貨のコスト) があります。イメージング、テーブルには次のデータがあります。

id | id_order | amount | ppu | ppu_cur  | costsA | costsA_cur  | costsB | costsB_cur 
1  | Ord1     | 20     | 10  | EUR      | 5      | USD         | 15     | EUR
2  | Ord1     |  8     | 20  | EUR      | 0      |             | 15     | EUR
3  | Ord1     | 15     | 50  | USD      | 10     | USD         | 0      | 
4  | Ord2     | 50     | 25  | EUR      | 10,50  | EUR         | 15     | EUR

今、私が必要としているのは、次のように価格をグループ化できるクエリです。

id_order | curr | price_total
Ord1     | EUR  | 390
Ord1     | USD  | 505
Ord2     | EUR  | 1275,5

情報: 「0」の価格または通貨のない価格は無視する必要があります。

残念ながら、私は ppu のみでこれを行うことができました:

SELECT "sub"."id", "sub"."cur", SUM("sub"."price_total")
FROM (
  SELECT "ord"."id" AS "id", ("oi"."amount" * "oi"."ppu") AS "price_total", "oi"."cur" AS "cur"
  FROM "orders" "ord", "orderitems" "oi"
  WHERE
    ("oi"."id_order" = "ord"."id") AND
    (("oi"."cur" IS NOT NULL) AND ("oi"."cur" <> '')) AND
    ("oi"."price" <> 0)
  ) "sub"
GROUP BY "sub"."id", "sub"."cur"

誰かがこの問題を解決する方法を知っていますか?

前もって感謝します :)

編集: 各注文価格は、通貨に基づいて計算する必要があります。たとえば、「Ord1」には 2 つの異なる通貨 (EUR、USD) があります。したがって、結果には "Ord1" の 2 つの行が含まれている必要があります。一方、「Ord2」には通貨(EUR)が1つしかありません。したがって、結果には "Ord2" の行が 1 つだけ含まれます。

計算: 同じ通貨の各 costX/ppu を追加する必要があります。さらに、ppu に金額を掛ける必要があります。「Ord1」の例:

EUR: (20 * 10 + 15) + (8 * 20 + 15)
USD: (5) + (15 * 50 + 10)

情報:この例には 2 つの異なる通貨しかありません。ただし、通貨の数に制限はありません。

4

2 に答える 2

1

列ごとに個別の通貨を使用すると少し注意が必要になるため、cteを作成して価格を明細化し、そこから適切なグループで合計を選択するのが最も簡単な方法です。

WITH cte AS (
  SELECT id_order,ppu_cur curr,amount*ppu price FROM orderitems  -- amount*ppu
  UNION ALL
  SELECT id_order,"costsA_cur","costsA" FROM orderitems          -- costsA
  UNION ALL
  SELECT id_order,"costsB_cur","costsB" FROM orderitems          -- costsB
)
SELECT id_order,curr,SUM(price)
FROM cte
WHERE curr IS NOT NULL AND price<>0
GROUP BY id_order,curr

テスト用のSQLfiddle

于 2013-02-27T17:08:51.163 に答える
0

ロジックをうまく説明できていませんが、結果から理解できたと思います。

これを試して:

select id_order, curr, sum(amount*(ppu+AddedCost)) as price_total
from (select t.*,
             (case when ppu_cur = costsa_cur then costsa
                   when ppu_cur = costSB_cur then costsb
                   else 0
              end) as AddedCost
      from t
     ) t
group by id_order, curr

追加コストの計算をより明確にするために、サブクエリを使用しています。

于 2013-02-27T16:57:51.353 に答える