首页 > 解决方案 > 如何合并 2 个表以获得每个子类别的希望日期和最后订购日期?

问题描述

例如,我有一个如下所示的愿望表,该表包含有关客户愿望清单详细信息的数据

EmailAddress    wish_created_date   Category
a@gmail.com     Aug-3-2021          Curtain
a@gmail.com     Aug-2-2021          Table
b@gmail.com     Aug-2-2021          Sofa
b@gmail.com     Aug-2-2021          Sofa
b@gmail.com     Aug-2-2021          Sofa
e@gmail.com     Aug-3-2021          Sofa
e@gmail.com     Aug-3-2021          Sofa
e@gmail.com     Aug-3-2021          Sofa

然后我有另一个名为 - last_category_orders的表。此表包含有关每个类别中客户最后订购日期的数据。有4类窗帘,桌子,椅子,沙发

EmailAddress    last_curtain_order  last_table_order    last_sofa_order last_chair_order
a@gmail.com     Aug-5-2021           Aug-3-2021     
b@gmail.com                                              Aug-5-2021 
c@gmail.com     Aug-9-2021                                               Aug-9-2021
d@gmail.com                          Aug-9-2021          Aug-9-2021 
e@gmail.com                                                              Aug-10-2021

预期结果 我的决赛桌应该如下所示,

EmailAddress    wish_created_date   Category            last_cat_order
a@gmail.com     Aug-3-2021          Curtain             Aug-5-2021
a@gmail.com     Aug-2-2021          Table               Aug-3-2021
b@gmail.com     Aug-2-2021          Sofa                Aug-5-2021
b@gmail.com     Aug-2-2021          Sofa                Aug-5-2021
b@gmail.com     Aug-2-2021          Sofa                Aug-5-2021
e@gmail.com     Aug-3-2021          Sofa                null
e@gmail.com     Aug-3-2021          Sofa                null
e@gmail.com     Aug-3-2021          Sofa                null

最终表应该是希望last_category_orders表的左连接,带有 last_cat_order 日期。

示例:a@gmail.com 为窗帘创建了愿望。a@gmail.com 的 last_curtain_order 是 2021 年 8 月 5 日。这必须显示在决赛桌中。

我被困在如何在决赛桌中获得结果。

标签: mysqlsql

解决方案


Mysql 没有 unpivot 运算符,因此您可以使用下面的 union 来实现它

select w.*, cat.date last_cat_order
from wish w
left join 
(
select 
max(last_curtain_order ) date, 'curtain' category, emailaddress
from  last_category_orders LC
group by emailaddress
union 
max(last_table_order) date,'table' category, emailaddress
from  last_category_orders LC
group by emailaddress
union 
max(last_sofa_order) date,'sofa' category, emailaddress
from  last_category_orders LC
group by emailaddress
union 
max(last_chair_order) date,'chair' category, emailaddress
from  last_category_orders LC
group by emailaddress
)Cat
on cat.emailaddress = w.emailaddress
and cat.category =w.Category

推荐阅读