# 电商面试题：如何分析复杂业务？

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6kXl9m1T2tdRj7oQ8%2F-MV6kmOkQ7OOw7u9dZMm%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_1.jpg?alt=media\&token=c3bed1c5-af94-4981-8c1e-de5b86c5c8d0)

**【题目】**

某公司在不同的电商平台上都有店铺，下面是该公司的销售数据表 (每个表有一行示例数据)。

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6kXl9m1T2tdRj7oQ8%2F-MV6ll-O_e5kejO08Idu%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_2.png?alt=media\&token=f0d04549-e204-4743-88ec-76040be921e5)

现在需要解决的业务问题是：

1.对于指定品类号范围（品类号列表：12，33，45，99，1001），查询 2019 年每个电商平台上每个品牌号对应每个品类号的累计销售额，输出格式如下

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6kXl9m1T2tdRj7oQ8%2F-MV6lrKhGOQsJXkjuB8_%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_3.jpg?alt=media\&token=dbec986d-a7de-4ac8-9e80-775f2a3dff62)

2.查询 2019 年有 5 个以上 (含 5 个) 不同 品类号 的 单月单平台销售额大于等于 10000 的品牌列表，及对应的不同品类号 数量，输出格式如下

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6kXl9m1T2tdRj7oQ8%2F-MV6m8MUfgD5SZWBBpe1%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_4.jpg?alt=media\&token=22f7c35d-5360-4881-9058-61a586fb6512)

3.查询 2019 年只在电商平台 1 上有销售额的品牌中（即排除电商平台为 2 时销售额累计大于 0 的品牌），电商平台 1 的累计销售额最大的 Top30 个品牌及对应的销售额，输出格式如下

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6kXl9m1T2tdRj7oQ8%2F-MV6mUT9xWZr3bQCU-rQ%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_5.jpg?alt=media\&token=d6b41bea-e4ee-4ecc-9220-cddef58bed77)

4.查询 2019 年在两个电商平台中分别同时都能进入销售额 Top 50 的品牌及对应的全电商平台累计销售额，输出格式如下

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6kXl9m1T2tdRj7oQ8%2F-MV6mXx5Z7ScK4LwEDcF%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_6.jpg?alt=media\&token=9427137f-53ea-418e-8f33-439393be49f4)

**【解题步骤】**

**问题 1：对于指定品类号范围（品类号列表：12，33，45，99，1001），查询 2019 年每个电商平台上每个品牌号对应每个品类号的累计销售额，输出格式如下**

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6kXl9m1T2tdRj7oQ8%2F-MV6mfH3MeDdmJxHcHgO%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_7.jpg?alt=media\&token=5bea32e7-cc9f-467c-980b-2936fcb86583)

使用[逻辑树分析方法](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649246563\&idx=2\&sn=3ffe509999d144d23dec5acc101fc2ef\&chksm=835fc353b4284a45ce01391453fe2fec1b225bbd6bbdb67dd7f304aacdd4f21f60d0b27ba309\&scene=21#wechat_redirect)，将复杂问题拆解为简单问题：

（1）查询结果：品牌名，品类名，电商平台、销售额

（2）筛选条件：品类号列表（12，33，45，99，1001），2019 年

（3）每个电商平台上每个品牌号对应每个品类号的累计销售额

**1. 查询结果：品牌名，品类名，电商平台、销售额**

这些列分别来自 3 个不同的表，需要多表联结

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6kXl9m1T2tdRj7oQ8%2F-MV6mirMGu8Vsy0U6b9A%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_8.jpg?alt=media\&token=f0e953c1-edd8-4630-986d-d1d1ae3a9dae)

```sql
select *
from 品牌表 as a 
inner join 月销售统计表 as c
on a.品牌号 = c.品牌号
inner join 品类表 as b
on b.品类号 = c.品类号;
```

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6kXl9m1T2tdRj7oQ8%2F-MV6mpLa3vrdaqodaRyN%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_9.jpg?alt=media\&token=28cd269e-ec3c-40e7-a2a9-d9e531dac61d)

把这个查询结果当做临时表

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6naKMOnLU98L22t4k%2F-MV6ngZo4jbKxpnabbw3%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_10.png?alt=media\&token=1c35d6d5-91dc-4b0a-8520-0080c809832e)

**2. 筛选条件：品类号列表（12，33，45，99，1001），2019 年**

使用 where 子句筛选出符合条件的数据

```sql
select *
from 临时表
where 品类号 in(12，33，45，99，1001)
      and year(月份) = 2019;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6nvmuY5Y23s_1HnJM%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_11.png?alt=media\&token=06cb2013-7a92-4742-84cc-aad604f4f5c6)

**3. 每个电商平台上每个品牌号对应每个品类号的累计销售额**

看到 "每个"，要想到《[猴子 从零学会 sql](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649247566\&idx=2\&sn=5af748b677eb72028764dde0577675fb\&chksm=835fc77eb4284e68e8cfe3f08c5a671b9e080b2651f20b40b1c793ffda4042ae43ad8f35a755\&scene=21#wechat_redirect)》里见过的这类问题要用分组汇总。

```sql
select sum(销售额) as 销售额
from 临时表
where 品类号 in(12，33，45，99，1001)
      and year(月份) = 2019
group by 电商平台,品牌号,品类号;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6nzbbc7NyJ0zXyXc1%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_12.png?alt=media\&token=31f24caa-f84a-4ded-81c6-f0c54882bade)

把临时表的 sql 套入上面就得到最终的 sql：

```sql
select a.品牌号,品牌名,b.品类号,品类名,电商平台,sum(销售额) as 销售额
from 品牌表 as a 
inner join 月销售统计表 as c
on a.品牌号 = c.品牌号
inner join 品类表 as b
on b.品类号 = c.品类号
where 品类号 in(12，33，45，99，1001)
      and year(月份)= 2019
group by a.品牌号,品牌名,b.品类号,品类名,电商平台;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6oQwQfsGH9c4tLn2K%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_13.png?alt=media\&token=b60cddf2-1687-4e89-93a8-f2a0fbb190fd)

**问题 2: 查询 2019 年有 5 个以上 (含 5 个) 不同品类号的单月单平台销售额大于等于 10000 的品牌列表，及对应的不同品类号数量，输出格式如下**

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6oGZ_ttYXVo7olV3h%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_14.jpg?alt=media\&token=605d1203-3652-4911-8c2b-fc9f25f1437f)

使用[逻辑树分析方法](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649246563\&idx=2\&sn=3ffe509999d144d23dec5acc101fc2ef\&chksm=835fc353b4284a45ce01391453fe2fec1b225bbd6bbdb67dd7f304aacdd4f21f60d0b27ba309\&scene=21#wechat_redirect)将复杂问题变简单：

（1）查询结果：品牌号、品牌名、品类数量

（2）筛选条件：2019 年

（3）不同品类号的单月单平台的销售额

（4）5 个以上 (含 5 个) 不同品类号

（5）销售额大于等于 10000

**1. 查询结果：品牌号、品牌名、品类数量**

查询结果涉及到 2 张表需要用到多表查询，用哪种联结呢？

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6oWKn9tklFeUXjCtD%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_15.png?alt=media\&token=4665d13e-e4cc-4692-8d00-4abc0342c2c6)

因为题目要求查询所有符合条件的品牌号，而品牌表包含了所有品牌号，所有需要以 " 品牌表 " 进行左联结，保留左边表 (品牌表) 里的全部数据。

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6o_dsPc-_xEuQSJYM%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_16.jpg?alt=media\&token=db9d5059-6379-4a63-92b5-ddd9a6d65244)

```sql
select *
from 品牌表 as a 
left join 月销售统计表 as c
on a.品牌号 = c.品牌号;
```

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6ojqnkHCfcpuJwN2L%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_17.jpg?alt=media\&token=a41a2c11-4e2e-46b7-b7bb-0fee540bde6c)

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6onTl2BbJoXYE0S7R%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_18.png?alt=media\&token=106beb07-6936-4b4d-8894-757b4d846107)

把上面查询结果当做临时表。

**2. 筛选条件：2019 年**

```sql
select *
from 临时表
where year(月份) = 2019;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6onTl2BbJoXYE0S7R%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_18.png?alt=media\&token=106beb07-6936-4b4d-8894-757b4d846107)

**3. 不同品类号的单月单平台的销售额**

也就是每个品类号每个月每个平台，涉及到 “每个” 需要用到分组汇总。

```sql
select sum(销售额)
from 临时表
where year(月份) = 2019
group by 品类号,月份,电商平台;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6peaAiHAI73GAQPFb%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_19.png?alt=media\&token=e269db3c-c19e-48e9-bcdf-e36fc432076e)

**4.5 个以上 (含 5 个) 不同品类号**

需要用 count，distinct 筛选出符合条件的数据。

```sql
select sum(销售额) as 销售额
from 临时表
where year(月份) = 2019
group by 品类号,月份,电商平台
having count(distinct 品类号) >= 5;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6pkMmsRQXC7-Y5RLy%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_20.png?alt=media\&token=04ac3aa9-1fbc-47db-aee0-8786dc100c39)

**5. 销售额大于等于 10000**

```sql
select sum(销售额) as 销售额
from 临时表
where year(月份) = 2019
group by 品类号,月份,电商平台
having count(distinct 品类号) >= 5
       and 销售额>= 10000;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6q0XT4iBKmwb_WqcP%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_21.png?alt=media\&token=7a60b5bc-9e2d-4965-8817-f9d33630ac8b)

输出格式如下：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6noBw_-P-KlbH5X73%2F-MV6q5nJTPJyTer3MIg3%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_22.jpg?alt=media\&token=08e99ad4-af25-43bc-8bb3-696a54516f18)

把临时表的 sql 套入上面就得到最终的 sql：

```sql
select a.品牌号,品牌名,count(distinct 品类号) as 品类号数量
from 品牌表 as a left join 月销售统计表 as c
on a.品牌号 = c.品牌号
where year(月份) = 2019
group by a.品牌号,品牌名,月份,电商平台
having count(distinct 品类号) >= 5
       and 销售额>= 10000;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6qS4CwUvKmzOkZ4zY%2F-MV6sxqspURvxuVvU86Q%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_23.png?alt=media\&token=c0bc4c82-6502-4ee1-b715-ff8d5378d729)

**问题 3:** **查询 2019 年只在电商平台 1 上有销售额的品牌中（即排除电商平台为 2 时销售额累计大于 0 的品牌），电商平台 1 的累计销售额最大的 Top30 个品牌及对应的销售额，输出格式如下**

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6qS4CwUvKmzOkZ4zY%2F-MV6t0sv5Uy5Dan4qVO8%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_24.jpg?alt=media\&token=dd3ea672-6d55-4811-89d6-f9854fb2a3c7)

使用[逻辑树分析方法](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649246563\&idx=2\&sn=3ffe509999d144d23dec5acc101fc2ef\&chksm=835fc353b4284a45ce01391453fe2fec1b225bbd6bbdb67dd7f304aacdd4f21f60d0b27ba309\&scene=21#wechat_redirect)，将复杂问题拆解为简单问题：

（1）查询结果：品牌号，品牌名，平台 1 总销售额

（2）筛选条件：2019 年

（3）只在电商平台 1 上有销售额的品牌 (即平台 2 的累计销售额为 0)

（4）电商平台 1 的累计销售额最大的 Top30 个品牌及对应的销售额

**1. 查询结果：品牌号，品牌名，平台 1 总销售额**

输出的表中有品牌号，品牌名和销售额，所有需要用到联结，联结品牌表和月销售统计表，联结方式和问题 2 相同

```sql
select *
from 品牌表 as a left join 月销售统计表 as c 
on a.品牌号 = c.品牌号;
```

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6qS4CwUvKmzOkZ4zY%2F-MV6tAfpWwUgYpMrVQby%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_25.jpg?alt=media\&token=b6674c39-b351-4804-b780-a91bcfb328b2)

把查询结果当做临时表。

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6qS4CwUvKmzOkZ4zY%2F-MV6tEg8HlmJxpPRnW8M%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_26.png?alt=media\&token=eee719bf-181d-449c-8c0b-983c9c702c86)

**2.** **筛选条件：2019 年**

```sql
select *
from 临时表
where year(月份) = 2019;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6qS4CwUvKmzOkZ4zY%2F-MV6u0HG4RCr4wxKa4Ia%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_26.png?alt=media\&token=84f1c13b-a1cb-4390-89ec-eb7eb64e4446)

**3. 只在电商平台 1 上有销售额的品牌 (即平台 2 的累计销售额为 0)**

需要用 group by 对品牌号，电商平台分组，用 having 筛选出平台为 2 且销售额为 0 的品牌号作为**子查询**

```sql
select a.品牌号
from 临时表
where year(月份) = 2019
group by a.品牌号,电商平台
having 电商平台 = 2 and sum(销售额) = 0;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6qS4CwUvKmzOkZ4zY%2F-MV6u8f9jueF8OhWFeQ2%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_27.png?alt=media\&token=8d625201-3ea0-4002-8b77-1890b8b0d5f0)

**4. 电商平台 1 的累计销售额最大的 Top30 个品牌及对应的销售额**

观察输出格式要求。

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6qS4CwUvKmzOkZ4zY%2F-MV6uFc4MkTp30n_GO4s%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_28.jpg?alt=media\&token=e631fe1c-6b49-424b-8ed7-fe7803cd528c)

可以看出需要要用 group by 对品牌号，品牌名，电商平台分组，

用 having 和 in 筛选出平台为 1 且在平台 2 销售额为 0 的 Top30 个品牌号，品牌名及对应的销售额。

并用 order by 对销售额排序, 并用 limit 取前 30 项

```sql
select a.品牌号,sum(销售额) as '平台1总销售额'
from 临时表
where year(月份) = 2019
group by a.品牌号,电商平台
having 电商平台 = 1 and a.品牌号 in (子查询)
order by sum(销售额) desc
limit 30;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6qS4CwUvKmzOkZ4zY%2F-MV6uU0zCAkTd1d9wDHg%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_28.png?alt=media\&token=b2f0f1a2-d5b4-48d4-a7af-f60a0e32ef49)

观察输出格式要求：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6qS4CwUvKmzOkZ4zY%2F-MV6ubn4nBaRChNGrVcT%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_29.jpg?alt=media\&token=fe65b516-e4c7-447c-a86d-b509b793f0b5)

最终答案：

```sql
select a.品牌号,品牌名,sum(销售额) as '平台1总销售额'
from 品牌表 as a left join 月销售统计表 as c 
on a.品牌号 = c.品牌号
where year(月份) = 2019
group by a.品牌号,品牌名,电商平台
having 电商平台 = 1 and a.品牌号 in (
select a.品牌号
from 品牌表 as a left join 月销售统计表 as c 
on a.品牌号 = c.品牌号
where year(月份) = 2019
group by a.品牌号,电商平台
having 电商平台 = 2 and sum(销售额) = 0
)
order by sum(销售额) desc
limit 30;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6vLx7zW3VEAQJPBMj%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_30.png?alt=media\&token=ddcda6da-87d7-4ae3-9387-6407ea36c4b0)

**问题 4:** **查询 2019 年在两个电商平台中分别同时都能进入销售额 Top 50 的品牌及对应的全电商平台累计销售额，输出格式如下**

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6vQ4ydPcVAjvihlTl%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_31.jpg?alt=media\&token=e874b485-dfd6-40ff-bc9c-6cde7dae6078)

使用[逻辑树分析方法](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649246563\&idx=2\&sn=3ffe509999d144d23dec5acc101fc2ef\&chksm=835fc353b4284a45ce01391453fe2fec1b225bbd6bbdb67dd7f304aacdd4f21f60d0b27ba309\&scene=21#wechat_redirect)，将复杂问题拆解为简单问题：

（1）查询结果：品牌号，品牌名，全平台累计销售额

（2）筛选条件：2019 年

（3）在两个电商平台中分别同时都能进入销售额 Top 50 的品牌

（4）品牌对应的全电商平台累计销售额

**1. 查询结果：品牌号，品牌名，全平台累计销售额**

输出的表中有品牌号，品牌名和销售额，所有需要用到联结，联结品牌表和月销售统计表，联结方式和问题 2，问题 3 相同

```sql
select *
from 品牌表 as a left join 月销售统计表 as c 
on a.品牌号 = c.品牌号;
```

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6vavf5frdmQiFj314%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_32.jpg?alt=media\&token=9850cd68-16b8-4643-a5b9-d0b14efbfc07)

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6vp6p9jSRkisbXqpC%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_33.png?alt=media\&token=328a323a-7fe8-44d3-b9f1-313a3c5584f6)

**2. 筛选条件：2019 年**

where 子句限制条件

```sql
select *
from 品牌表 as a left join 月销售统计表 as c 
on a.品牌号 = c.品牌号
where year(月份) = 2019;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6vp6p9jSRkisbXqpC%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_33.png?alt=media\&token=328a323a-7fe8-44d3-b9f1-313a3c5584f6)

**3. 在两个电商平台中分别同时都能进入销售额 Top 50 的品牌**

1）因为月销售统计表中**同品牌号同平台**包含了**不同的品类号**

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6vavf5frdmQiFj314%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_32.jpg?alt=media\&token=9850cd68-16b8-4643-a5b9-d0b14efbfc07)

所有应该用 group by 按品牌号和电商平台分组，计算每个品牌在每个电商平台的累计销售额

```sql
select 品牌号,电商平台,sum(销售额) as 总销售额
from 月销售统计表
where year(月份) = 2019
group by 品牌号,电商平台;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6w1HM3YqfnC0Mw3Ei%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_34.png?alt=media\&token=16e57a6a-3bdf-41af-89c2-c417c32997b5)

将上述结果作为临时表，表名为：销售统计表

2）分别**同时**都能进入销售额 Top 50 的品牌：

这是《猴子 从零学过 sql》里讲过的 [top N 问题。](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649247630\&idx=1\&sn=663ab9bb96107e560f1fe52b53faba97\&chksm=835fc7beb4284ea8d3e006deec3836df0bccc29ade3f4915b76cdb0f52a704df0ee2e53af6c2\&scene=21#wechat_redirect)

先从简单的入手：查询每个平台销售额最高的**两个**品牌（即对平台进行分组，对销售额进行排序），套用之前讲过的 [top N 问题](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649247630\&idx=1\&sn=663ab9bb96107e560f1fe52b53faba97\&chksm=835fc7beb4284ea8d3e006deec3836df0bccc29ade3f4915b76cdb0f52a704df0ee2e53af6c2\&scene=21#wechat_redirect)模板。

```sql
#TOP N问题SQL模板
select *
from (
   select*,
         row_number() over (partition by 要分组的列名
                       order by 要排序的列名 desc) as ranking
   from 表名) as a
where ranking <= N;
```

对应这个案例就是：

```sql
select *
from (
   select*,
         row_number() over (partition by 电商平台
                       order by 总销售额 desc) as ranking
   from 销售统计表) as a
where ranking <=2;
```

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6wHsPp1NdaYoi9Z0k%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_35.jpg?alt=media\&token=9a82c633-2aed-4441-89fc-56c4c9fb5229)

那么在两个平台内都进入 TOP2 的品牌号呢？

从上图可以看出，很显然是品牌号是 158。因此我们需要对品牌号分组，用 count 对品牌号进行计数，大于或等于 2 则该品牌同时在两个平台均进入 TOP2

```sql
select 品牌号,sum(总销售额) as 平台总销售额
from (
   select*,
         row_number() over (partition by 电商平台
                       order by 总销售额 desc) as ranking
   from 销售统计表) as a
where ranking <=2
group by 品牌号
having count(电商平台) >= 2;
```

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6wO9GQlM6Af65ilNT%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_36.jpg?alt=media\&token=0bad04ef-8575-4f46-8808-0256164f8a77)

3）现在可以知道如何求在两个平台内都进入 TOP50 的品牌号了，只需把 ranking <= 2 改为 ranking <= 50 即可

```sql
select 品牌号,sum(总销售额) as 全平台累计销售额
from (
   select*,
         row_number() over (partition by 电商平台
                       order by 总销售额 desc) as ranking
   from 销售统计表) as a
where ranking <=50
group by 品牌号
having count(电商平台) >= 2;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6wWN3qV-do5WySoCd%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_37.png?alt=media\&token=be377086-48ba-45f2-a67c-98ed7992486a)

仍然将此表作为临时表，表名为：前五十品牌号

**4. 品牌对应的全电商平台累计销售额**

因为输出格式中有品牌名，所以需要联结品牌表和前五十品牌号，因为输出的是进入 TOP50 的品牌号，所以需要以 "前五十品牌表" 进行右联结，保留右边表 (前五十品牌表) 里的全部数据。

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6xn9lJgqIK9Am5L1c%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_38.jpg?alt=media\&token=ffd4fb91-1aa9-47b5-8d52-55b5933377e2)

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6xriJ6c-qwXkvMpZJ%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_39.png?alt=media\&token=70825793-b9c3-4bf9-a892-1253a58ead99)

求出品牌号为前五十品牌号的品牌号、品牌、全平台累计销售额：

```sql
select a.品牌号,a.品牌名,全平台累计销售额
from 品牌表 as a right join 前五十品牌号 as b
on a.品牌号 = b.品牌号
where a.品牌号 in (b.品牌号)
group by a.品牌号,a.品牌名;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6ynI9QyhDlM0K59gN%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_40.png?alt=media\&token=03154479-8d0b-4a64-a694-f52dc1ec2aa8)

最终答案：

```sql
with 销售统计表(品牌号,电商平台,总销售额)
as
(select 品牌号,电商平台,sum(销售额) as 总销售额
from 月销售统计表
where year(月份) = 2019
group by 品牌号,电商平台),
前五十品牌号 as
(select 品牌号,sum(总销售额) as 全平台累计销售额
from (
   select *,
          row_number() over(partition by 电商平台
                       order by 总销售额 desc) as ranking
   from 销售统计表) as a
where ranking <=50
group by 品牌号
having count(电商平台) >= 2)
select a.品牌号,a.品牌名,全平台累计销售额
from 品牌表 as a right join 前五十品牌号 as b
on a.品牌号 = b.品牌号
where a.品牌号 in (b.品牌号)
group by a.品牌号,a.品牌名;
```

查询结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6ynI9QyhDlM0K59gN%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_40.png?alt=media\&token=03154479-8d0b-4a64-a694-f52dc1ec2aa8)

**【本题考点】**

1）考查对字符串的编程能力。

2）考查多表联结，TOPN 问题。

3）考查思维能力，面对多个条件和多个表，如何用[逻辑树分析方法](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649246563\&idx=2\&sn=3ffe509999d144d23dec5acc101fc2ef\&chksm=835fc353b4284a45ce01391453fe2fec1b225bbd6bbdb67dd7f304aacdd4f21f60d0b27ba309\&scene=21#wechat_redirect)理清思路，解决问题。

4）top n 问题的应用变化

**【举一反三】**

本题的模拟数据可以在公众号（猴子聊人物）对话框回复 “资料”，在下面网盘路径中获取到

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6zCBqPmLoR9sFydZO%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_41.png?alt=media\&token=52380c25-d992-4395-8701-6eb603164171)

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6zRQ5PWE20dkaskcd%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_42.png?alt=media\&token=d46f28eb-5414-4361-beee-0817e0a6f1c8)

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6zVrDgeNbSQLAI3DN%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_43.png?alt=media\&token=1d36897a-6818-42ee-9bd6-8aa2e1b52c59)

推荐：[如何从零学会 sql？](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649247566\&idx=2\&sn=5af748b677eb72028764dde0577675fb\&chksm=835fc77eb4284e68e8cfe3f08c5a671b9e080b2651f20b40b1c793ffda4042ae43ad8f35a755\&scene=21#wechat_redirect)

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MV6v3mMx1r3BEseiwSu%2F-MV6z_u4PJc8fN7389gB%2F%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E8%B4%9F%E8%B4%A3%E4%B8%9A%E5%8A%A1_44.jpg?alt=media\&token=be9fe46d-932e-412d-8460-cdbe6ecae609)
