比较这两个表不会产生预期的结果。我该如何解决?

Posted

技术标签:

【中文标题】比较这两个表不会产生预期的结果。我该如何解决?【英文标题】:Comparing the two tables does not produce the desired result. How can I fix it? 【发布时间】:2020-04-13 06:48:33 【问题描述】:

我想比较两张表。 但是,它们不是在同一日期进行比较的。

1.表名:hospital_payment_data

id    chart_num        chart_name          visit            card_amount_received
1        9740             t1             2019-01-02               500                        
2        9740             t1             2019-01-02               500           
3        23143            t2             2019-01-02               2000                        
4        14220            t3             2019-01-02               3000              

2.表名:credit_card

id           card_date             advenced_amount
1           2019-01-02                 1000        
2           2020-01-02                 2000   
3           2020-01-02                 3000 

3.table 名称:图表

 id               name
9740               t1     
23143              t2          
14220              t3        

当我发送查询时,我得到以下信息:

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received,
  credit_card.card_date,
  credit_card.amount as amount,
  if(credit_card.amount = sum(card_amount_received), 'ok', 'error') as result
from hospital_payment_data
join charts on charts.id = chart_num
left join credit_card on date(credit_card.card_date) = visit
group by chart_num, visit

错误的结果:

我想要结果

如何解决我的查询?请帮帮我。

【问题讨论】:

你的错误结果和预期的结果是一样的 修改完成 常见的JOIN乘法。在子查询中计算总和,然后加入另一个表。 我认为您在 credit_card 表中缺少一列,因为除了日期之外,无法将此表记录链接到 hospital_payment_data 表中的任何卡。这里应该有另一个外键链接到记录所属的卡 @Akina 你能详细解释一下吗? 【参考方案1】:

这是常见的 JOIN 乘法。在子查询中计算总和,然后加入另一个表。

你能给我解释一下吗? – 用户 1082164

想象有一张桌子

id   val
 1   100
 1   200

val 的总和是 300。 想象一下还有一张桌子

id   txt
 1   'A'
 1   'B'

id 加入第一个。连接第一个表的每一行时,将连接到第二个表的每个匹配行:

SELECT id, val, txt FROM t1 JOIN t2 USING (id);

id   val  txt
 1   100  'A'
 1   200  'A'
 1   100  'B'
 1   200  'B'

现在val 在加入聚集体中的总和是 600 - 它乘以每个连接。

为了得到正确的和,我们必须首先在子查询中对单个表求和(不加入乘法效应),然后将另一个表加入求和子查询。

PS。我不会编辑您的查询 - 它与 ONLY_FULL_GROUP_BY 设置不匹配。

【讨论】:

谢谢。我会试试的。 我认为该答案不适用于该问题,因为表之间没有ID链接。 @Tajniak 一些链接存在 - 所以它是适用的。它不是主键。如您所见,id 是一个通用字段(它甚至不是唯一的)。想象一下,它的名字不是id,而是some_column 但我们无法链接hospital_payment_data.idcredit_card.id。如果是这样,那么表 hospital_payment_data 中的 id 2 也应该是 1。我们可以链接此数据的唯一方法是按日期。而且这个表中似乎有 2 个键。 @Tajniak 我的答案目标不是解决 OP 的问题 - 我只解释为什么总和值会增加。也许你知道等于用过的“JOIN 乘法”这个词,不需要额外解释?【参考方案2】:

您的表结构无效。您在表credit_card 中的数据应该是可识别的,并且您应该将付款与债务联系起来。目前有两种解决方案。

    将新列 card_idchart_num_id 添加到表 credit_card。然后,如果您在向该表中添加行时无法执行此操作,则可以定期运行脚本,将 card_id 的值分配给卡。但是...如果有 2 笔 2000 美元的债务,而您只会收到一笔 2000 美元的付款,该怎么办。如果没有有关该付款的其他信息,就不可能将一笔付款分配给正确的 ID。

    每天按日期分组检查付款而不是卡片。您可以通过检查每天的付款总额来修改 SQL 脚本。现在您可以在chart_num 上分组付款,而是可以在card_datevisit 上分组。

    您仍然可以构造有效的 SQL 查询,但非常复杂,我完全不明白为什么这比 1. 想法更可取。几乎没有任何利润的大量努力。

【讨论】:

你能详细解释一下你的提及吗? 我编辑了我的答案。您想详细了解什么解决方案?

以上是关于比较这两个表不会产生预期的结果。我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

比较 object.Value = Null 不会产生预期的结果

如何比较两个表数据的差异

MYSQL LAST_INSERT_ID 未按预期工作。我该如何解决?

如何使用 UCanAccess 在两个表之间创建关系?

我正在尝试创建多个循环,但是如果一个循环返回null,则不会运行其余的循环。我该如何解决?

我该如何解决这个问题。我正在尝试使用 len 功能,但它没有按预期工作 [重复]