首页 > 解决方案 > 如何仅对表中的唯一值求和

问题描述

我有一张桌子shipping_manifestcontain client_id,order_id和。pallet_idpallet_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(这是正确的,但不适用于其他场景)

我需要一个适用于两个订单的语句,因为表中有多个订单。

标签: sql

解决方案


所以基本上如果你的 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 


它给出以下结果: 结果


推荐阅读