我正在搜索可以将类似数据分组到一列的查询。 基本上,我有一个代表订单商品的表。每个订单商品都属于一个订单。订单商品具有金额,每单位价格(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”中有两种不同的货币(欧元,美元)。因此,结果必须有两行“Ord1”。 另一方面,“Ord2”中只有一种货币(EUR)。因此结果只包含“Ord2”的一行。
计算:必须添加具有相同货币的每个成本X / ppu。另外,ppu必须与数量相乘。 “Ord1”的示例:
EUR: (20 * 10 + 15) + (8 * 20 + 15)
USD: (5) + (15 * 50 + 10)
信息:示例中只有2种不同的货币。但是,可能有任何数量的货币。
答案 0 :(得分: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
答案 1 :(得分: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
我正在使用子查询来增加成本计算。