[英]SQL JOIN to Only One Row
我有2个销售数据表,没有公用密钥,只有销售日期和客户名称。 我想加入它们,以便表A中的每一行最多有表B中的1个匹配项,如果找不到则为0。 问题是同一客户在同一日期出现两次。 所以如果我有这些数据
Table A Table B
Customer | Date | Receipt Customer | Date | Invoice
=============================== ===============================
John | 2018-01-01 | A John | 2018-01-01 | C
John | 2018-01-01 | B John | 2018-01-01 | D
我怎么得到这个
Result
Customer | Date | Receipt | Invoice
=========================================
John | 2018-01-01 | A | C
John | 2018-01-01 | B | D
只要收据A匹配一次,收据A与发票C或D是否匹配都没有关系。 目前,我的查询加入了AC,AD,BC,BD
编辑:澄清一下,我不能从任何一个表重复。 一张发票和收据只能出现一次。 因此,这些结果之一是可以接受的:
这很痛苦,因为您需要枚举两个表,然后进行join
或聚合。 这是一种方法:
select customer, date, max(receipt) as receipt, max(invoice) as invoice
from ((select a.customer, a.date, a.receipt,
(@rnr := if(@cd = concat_ws(';', customer, date), @rnr + 1,
if(@cd := concat_ws(';', customer, date), 1, 1)
)
) as seqnum
from a cross join
(select @rnr := 0, @cd := '') params
order by a.customer, a.date
) union all
(select b.customer, b.date, b.invoice,
(@rni := if(@cd = concat_ws(';', customer, date), @rni + 1,
if(@cd := concat_ws(';', customer, date), 1, 1)
)
) as seqnum
from b cross join
(select @rni := 0, @cd := '') params
order by a.customer, a.date
)
) cd
group by customer, date, seqnum;
由于只希望使用不同的记录,为什么在加入两个表之后不只是进行不同的记录呢?
SELECT DISTINCT a.Customer,
a.Date,
a.Receipt,
b.Invoice
FROM Table_A a
JOIN Table_B b
ON a.Customer = b.Customer
AND a.Date = b.Date
我将给出一个您可能不会喜欢的答案:这不应该在SQL中完成。 这是一个演示/显示问题。
在向用户显示数据而不是SQL后端的层中执行此类工作。 他们在网页上查找吗? 然后让网页获取原始数据并根据需要对其进行格式化-将每天的收据或每天的发票的内容放在单独的div中。 SQL是否使用此数据发送电子邮件? 然后,不要让它生成纯文本电子邮件-让它生成HTML并将数据放入表格单元格中(这样,您就不必在数据量可能不同的两组数据之间协调行)。
您确实不想玩试图使SQL输出在SQL内部看起来很漂亮的游戏。 因为,说实话,你已经接受答案的代码可以正常工作 ,但我讨厌试图维护它多年来...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.