将内连接与 sum 一起使用时出现问题

Posted

技术标签:

【中文标题】将内连接与 sum 一起使用时出现问题【英文标题】:Issue while using inner join with sum 【发布时间】:2019-02-26 01:00:48 【问题描述】:

我有两 (2) 张桌子: ps_wk_mp_seller_transaction_history

还有 ps_wk_mp_seller_order_status

仅当 current_state = 5

时,我才想合计 seller_amount

为此我写了这个:

select sum(seller_amount) as seller_amount
from ps_wk_mp_seller_transaction_history th inner join 
     ps_wk_mp_seller_order_status os
     on os.id_order = th.id_transaction and
        os.current_state = 5 and
        th.id_customer_seller = 2;

对于 id_customer_seller=2,我得到这个 4984.020000 (4950+34.02),它是准确的

但是对于 id_customer_seller=5,我得到 25.848000 而不是 NULL

有人可以帮我吗?

也许你可以自己测试一下,代码是:https://github.com/kulturman/fakerepo

【问题讨论】:

ON 子句的最后一个谓词and th.id_customer_seller=? 应该过滤掉id_customer_seller=5 的所有记录。因此,在这种情况下,我看不出你怎么可能得到25.848。你能设置一个模型来演示你的问题吗? 也许你可以自己测试一下,这个代码:github.com/kulturman/fakerepo 您的 dB 设计看起来有缺陷,或者至少无法达到您想要的效果。运行查询,在其中选择 * 并且仅加入 id_order 和 id_transaction,您将获得六行,涵盖卖方和状态的所有组合,这意味着您永远不会从原始查询中获得空值,因为至少会为任何行选择一个组合状态和卖方的有效组合 您的问题暗示您期望第一个订单状态行与前两个交易行关联,第二个订单状态要关联到最后一个事务行的行。但是,您的查询将 both 订单状态行与所有三个交易行相关联。 (就像@JoakimDanielson 所说,这会产生 6 种组合。) 所以,我的问题是 为什么 你认为 只有 第二个订单状态行关联到最后一个交易行? (这是我可以看到您期望结果为 NULL 的唯一方法。) 他的问题是 id_transaction 与 current_state 5 和 14 相同,这就是为什么 id_customer_seller 不会为空 【参考方案1】:

首先,您的记录有一些逻辑问题,id_transaction 有两个交易,id_transaction 相同,但金额不同,state 不同!所以 id 41 的交易有状态 5 以及为什么客户 5 不会为空,因为 41 处于状态 5。

解决这个问题

每笔交易的交易id必须是唯一的,以便区分交易状态和金额

查询应该是这样的

select sum(seller_amount) as seller_amount
from ps_wk_mp_seller_transaction_history th 
left join ps_wk_mp_seller_order_status os 
  on os.id_order=th.id_transaction
where 
  th.id_customer_seller = 2
  and  os.current_state=5 

工作示例here

【讨论】:

OP 的问题源于查询 id_customer_seller=5 并且他/她期望 NULL。但是你的观点是正确的,id_transaction 涵盖了两个卖家的os.current_state=5 感谢您的回答,但架构不是我的。我正在尝试自定义 prestashop 第三方模块。这是一个市场,当客户下订单包含两个卖家的产品时,模块将创建两个“ps_wk_mp_seller_order_status”行。你明白我的意思吗?

以上是关于将内连接与 sum 一起使用时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

将 DAX 与 DynamoDB 一起使用时出现无法配置集群端点错误

使用 JDBC 获取与 MySQL 的连接时出现“连接过多”

EasyGBS与上级级联时出现contact内ip不符的处理方法

使用连接字符串通过 WCF 服务建立与 Azure SQL 数据库的连接时出现问题

将“HTTPd”与“Tomcat”连接时出现问题

FB 与 Three20 连接 - 登录 facebook 时出现问题