繁体   English   中英

SQL联接到仅一行

[英]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

编辑:澄清一下,我不能从任何一个表重复。 一张发票和收据只能出现一次。 因此,这些结果之一是可以接受的:

  • AC和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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM