sql - 如何仅对表中的唯一值求和
问题描述
我有一张桌子shipping_manifest
,contain client_id
,order_id
和。pallet_id
pallet_volume
在第二个表中Order_header
,我有client_id
, order_id
, order_volume
。我需要计算pallet_volume + the order_volume
. 但是,表格中的一个订单可以有多个托盘,shipping_manifest
或者表格中可以有多个托盘shipping_manifest
。2 个示例订单
CLIENT_ID ORDER_ID PALLET_ID PALLET_VOLUME ORDER_VOLUME
A TESTJBDN11 373943762002480563 0.12 18
A TESTJBDN11 373943762002480549 0.12 18
A TESTJBDN11 H876 0.12 18
A TESTJBDN4 EXT-5422081 0.1 0.15
A TESTJBDN4 EXT-5422081 0.1 0.15
A TESTJBDN4 EXT-5422081 0.1 0.15
total_pallet_volume
应该是order_value +
每个pallet_volume
唯一的pallet_id
所以对于订单TESTJBDN11
它应该是18 + (3 * 0.12) = 18.36
,对于订单TESTJBDN4
它应该是0.15 + 0.1 = 0.25
我试过我试过做:
示例 A
SELECT sm.client_id,sm.order_id,sm.pallet_id, sm.pallet_volume,oh.order_volume,SUM(sm.pallet_volume)+oh.order_volume as "total_pallet_volume"
FROM Shipping_Manifest sm
LEFT JOIN order_header oh ON oh.order_id = sm.order_id AND oh.client_id = sm.client_id
WHERE sm.client_id = 'A' AND
sm.ORDER_ID = 'TESTJBDN4'
GROUP BY sm.client_id, sm.order_id,sm.pallet_id, sm.pallet_volume, oh.order_volume;
示例 B:
select sm.client_id,sm.order_id, sm.pallet_volume,oh.order_volume,
(select sum(sm.pallet_volume )+( oh.order_volume)
from Shipping_Manifest sm
left join order_header oh on oh.order_id = sm.order_id and oh.client_id = sm.client_id
WHERE sm.client_id = 'A' and
sm.ORDER_ID = 'TESTJBDN11'
group by sm.pallet_volume,oh.order_volume) AS "total_pallet_volume"
from Shipping_Manifest sm
left join order_header oh on oh.order_id = sm.order_id and oh.client_id = sm.client_id
WHERE sm.client_id = 'A' and
sm.ORDER_ID = 'TESTJBDN11';
示例 C:
SELECT sm.client_id,sm.order_id,sm.pallet_id, sm.pallet_volume,oh.order_volume,sm.pallet_volume +oh.order_volume as "total_pallet_volume"
FROM Shipping_Manifest sm
LEFT JOIN order_header oh ON oh.order_id = sm.order_id AND oh.client_id = sm.client_id
WHERE sm.client_id = 'A' AND
sm.ORDER_ID IN ('TESTJBDN11','TESTJBDN4')
GROUP BY sm.client_id, sm.order_id, sm.pallet_id, sm.pallet_volume, oh.order_volume,
sm.pallet_volume +oh.order_volume;
所以为了订购TESTJBDN11
它应该是18 + (3 * 0.12) = 18.36
使用选择示例 A - 实际输出是18.12
使用选择示例 B - 实际输出是18.36
(这是正确的,但不适用于其他场景)
使用选择示例 C - 实际输出为18.12
对于订单TESTJBDN4
,它应该是0.15 + 0.1 = 0.25
使用选择示例 A - 实际输出是 0.45
使用选择示例 B - 实际输出为 0.45
使用选择示例 C - 实际输出是 0.25
(这是正确的,但不适用于其他场景)
我需要一个适用于两个订单的语句,因为表中有多个订单。
解决方案
所以基本上如果你的 shipping_manifest 表shipping_manifest和 order_header order_header看起来像这样:
您可以运行以下查询:
select distinct s.client_id, s.order_id, pallet_id, pallet_volume * s.count_unique_pallet_id + s2.order_volumne as result
from shipping_manifest o left join (
SELECT a.client_id, a.order_id, count(distinct a.pallet_id) as count_unique_pallet_id
from shipping_manifest a
group by a.client_id, a.order_id) s
on o.client_id = s.client_id and o.order_id = s.order_id
left join (select client_id, order_id, order_volumne from order_header) s2
on o.client_id = s2.client_id and o.order_id = s2.order_id
它给出以下结果:
结果
推荐阅读
- python - Markdown 中的可折叠表格
- html - 角 [ngIf]、[ngIfElse] 和 [ngIfElseIf]
- node.js - 部署应用程序时 Heroku 控制台中的标准输入
- r - 如何将 collums 转换为行
- drupal - Drupal jsonapi 跨包模块使用
- slurm - 取消在某个日期之前提交或 JOBID 低于给定整数的作业
- spring - Spring Batch - 从 S3 读取多个文件
- swift - 如何为 iPhone 和 iPad 纵向和横向设置纵向模式?
- java - 如何使主要返回 char[]
- android - 使用 Bouncy Castle 后,Android 上没有系统 TLS