簡體   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