PostgreSQL复合类型数组数据查询:两类需求实现方法
针对PostgreSQL自定义类型的两个查询实现
1. 查询包含商品编号为6的所有订单
由于pedido表中的itemPedido是item_pedido类型的数组,且每个item_pedido包含mercadoria复合类型,需要用unnest()函数展开数组,再访问复合类型的字段:
SELECT DISTINCT p.* FROM pedido p JOIN unnest(p.itemPedido) AS item ON (item.mercadoria).codigo = 6;
说明:
unnest(p.itemPedido)将订单中的商品项数组拆分为行记录(item.mercadoria).codigo访问复合类型mercadoria中的codigo字段DISTINCT确保同一个订单即使包含多个编号6的商品也只返回一次
2. 查询客户编号53的订单总金额
需要计算每个商品项的实际金额,再按需求汇总:
情况1:查询该客户每个订单的总金额
SELECT p.codigo AS 订单编号, p.data_pedido AS 下单日期, SUM( (item.mercadoria).preco * item.quantidade * (1 - item.desconto) ) AS 订单总金额 FROM pedido p JOIN unnest(p.itemPedido) AS item ON p.codCliente = 53 GROUP BY p.codigo, p.data_pedido;
情况2:查询该客户所有订单的总金额
SELECT SUM( (item.mercadoria).preco * item.quantidade * (1 - item.desconto) ) AS 客户总订单金额 FROM pedido p JOIN unnest(p.itemPedido) AS item ON p.codCliente = 53;
说明:
(item.mercadoria).preco获取商品单价,乘以购买数量item.quantidade得到原价(1 - item.desconto)是折扣后的比例(假设desconto字段值为小数,比如0.1代表10%折扣;如果是百分比数值如10,则改为(1 - item.desconto/100))- 通过
GROUP BY控制是按单个订单汇总还是整体汇总
内容的提问来源于stack exchange,提问作者Matheus Henriques
相关产品推荐
相关产品推荐

