如何解决基于父表的Sql总结
我的sql看起来像:
create table ad(
ad_id int,ad_name varchar(10)
);
insert into ad(ad_id,ad_name) values
(1,'ad1'),(2,'ad2'),(3,'ad3');
create table ad_insight(
id int,ad_id int,date date,clicks int
);
insert into ad_insight(id,ad_id,date,clicks) values
(1,1,'2021-04-25',1),'2021-04-24',4),'2021-04-23',2),(4,2,6),(5,'2021-03-03',7);
create table product(
product_id int,product_name varchar(10)
);
insert into product(product_id,product_name) values
(1,'prod1'),'prod2'),'prod3'),'prod4');
(1,3,'prod1');
create table product_insight(
id int,product_id int,sale int,date date
);
insert into product_insight(id,product_id,sale,date) values
(1,12,'2021-04-25'),11,'2021-04-24'),13,'2021-04-23'),14,'2021-04-22'),17,'2021-04-21'),(6,15,'2021-04-20'),(7,'2021-04-19'),(8,19,'2021-04-25');
这里有fiddle
模式的快速解释: 我有广告:
- 每个广告都有洞察力,可以告诉我们某个广告何时处于活动状态。
- 每个广告都有产品。每个产品都有 product_insight,它告诉我们该产品在某一天产生了多少销售额。
现在我想得到以下表格:
- 将汇总
ad_insight
表中的点击次数,并汇总product_insight
至2021-04-23
中2021-04-25
的 product_sale。
+----------+--------+--------------+--------------+
| ad_name | clicks | product_sale | products |
+----------+--------+--------------+--------------+
| ad1 | 7 | 55 | prod1,prod2 |
| ad2 | 6 | 0 | prod3,prod4 |
| ad3 | 0 | 36 | prod1 |
+----------+--------+--------------+--------------+
- 汇总行将汇总上表中的所有内容:
+------------+--------------+--------------------+----------------------------+
| total_ads | total_clicks | total_product_sale | unique_all_products |
+------------+--------------+--------------------+----------------------------+
| 3 | 13| 91 | prod1,prod2,prod3,prod4 |
+------------+--------------+--------------------+----------------------------+
我尝试了什么?
# 1) table
select ad_name,SUM(ad_insight.clicks) as clicks
from ad
left join ad_insight on ad.ad_id = ad_insight.ad_id
where ad_insight.date >= '2021-04-23' and ad_insight.date <= '2021-04-25'
group by ad.ad_id;
# 2) table
select count(distinct ad_insight.ad_id) as total,SUM(ad_insight.clicks) as clicks
from ad_insight
left join ad on ad.ad_id = ad_insight.ad_id
where ad_insight.date >= '2021-04-23' and ad_insight.date <= '2021-04-25'
但是不知道怎么select product_sale 表和用逗号分隔的产品!
解决方法
如果我理解正确的话,您希望为每个广告汇总两个不同的维度(点击次数和销售额)。加入前汇总:
select ad.ad_name,ai.clicks,p.sales,p.products
from ad left join
(select ai.ad_id,sum(ai.clicks) as clicks
from ad_insight ai
where ai.date >= '2021-04-23' and ai.date <= '2021-04-25'
group by ai.ad_id
) ai
on ad.ad_id = ai.ad_id left join
(select p.ad_id,sum(pi.sale) as sales,group_concat(distinct p.product_name) as products
from product p join
product_insight pi
on pi.product_id = p.product_id
where pi.date >= '2021-04-23' and pi.date <= '2021-04-25'
group by p.ad_id
) p
on p.ad_id = ad.ad_id ;
第二个查询只是再次聚合。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。