文章目录
- 1. 题目
- 2. 解题
1. 题目
支出表: Spending
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| user_id | int |
| spend_date | date |
| platform | enum |
| amount | int |
+-------------+---------+
这张表记录了用户在一个在线购物网站的支出历史,
该在线购物平台同时拥有桌面端('desktop')和手机端('mobile')的应用程序。
这张表的主键是 (user_id, spend_date, platform)。
平台列 platform 是一种 ENUM ,类型为('desktop', 'mobile')。
写一段 SQL 来查找每天 仅 使用手机端用户、仅 使用桌面端用户、 同时 使用桌面端和手机端的用户人数和总支出金额。
查询结果格式如下例所示:
Spending table:
+---------+------------+----------+--------+
| user_id | spend_date | platform | amount |
+---------+------------+----------+--------+
| 1 | 2019-07-01 | mobile | 100 |
| 1 | 2019-07-01 | desktop | 100 |
| 2 | 2019-07-01 | mobile | 100 |
| 2 | 2019-07-02 | mobile | 100 |
| 3 | 2019-07-01 | desktop | 100 |
| 3 | 2019-07-02 | desktop | 100 |
+---------+------------+----------+--------+Result table:
+------------+----------+--------------+-------------+
| spend_date | platform | total_amount | total_users |
+------------+----------+--------------+-------------+
| 2019-07-01 | desktop | 100 | 1 |
| 2019-07-01 | mobile | 100 | 1 |
| 2019-07-01 | both | 200 | 1 |
| 2019-07-02 | desktop | 100 | 1 |
| 2019-07-02 | mobile | 100 | 1 |
| 2019-07-02 | both | 0 | 0 |
+------------+----------+--------------+-------------+
在 2019-07-01,
用户1 同时 使用桌面端和手机端购买,
用户2 仅 使用了手机端购买,
而用户3 仅 使用了桌面端购买。在 2019-07-02,
用户2 仅 使用了手机端购买,
用户3 仅 使用了桌面端购买,
且没有用户 同时 使用桌面端和手机端购买。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/user-purchase-platform
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 先造出表的各种组合
select distinct spend_date, "desktop" platform from Spending
union
select distinct spend_date, "mobile" platform from Spending
union
select distinct spend_date, "both" platform from Spending
{"headers": ["spend_date", "platform"],
"values": [
["2019-07-01", "desktop"],
["2019-07-02", "desktop"],
["2019-07-01", "mobile"],
["2019-07-02", "mobile"],
["2019-07-01", "both"],
["2019-07-02", "both"]]}
- 计算每天,某类属下的总金额、人数
select spend_date, if(count(distinct platform)=1, platform, 'both') plat,sum(amount) total_am,count(distinct user_id) total_u # 1 total_u 这么写也对,就1个人
from Spending
group by spend_date, user_id
{"headers": ["spend_date", "plat", "total_am", "total_u"],
"values": [
["2019-07-01", "both", 200, 1],
["2019-07-01", "mobile", 100, 1],
["2019-07-01", "desktop", 100, 1],
["2019-07-02", "mobile", 100, 1],
["2019-07-02", "desktop", 100, 1]]}
- 上面2表连接
select p.spend_date, p.platform, t.total_am, t.total_u
from
(select distinct spend_date, "desktop" platform from Spendingunionselect distinct spend_date, "mobile" platform from Spendingunionselect distinct spend_date, "both" platform from Spending
) p
left join
(select spend_date, if(count(distinct platform)=1, platform, 'both') plat,sum(amount) total_am,count(distinct user_id) total_ufrom Spendinggroup by spend_date, user_id
) t
on p.platform = t.plat and p.spend_date = t.spend_date
{"headers": ["spend_date", "platform", "total_am", "total_u"], 。
"values": [
["2019-07-01", "desktop", 100, 1],
["2019-07-02", "desktop", 100, 1],
["2019-07-01", "mobile", 100, 1],
["2019-07-02", "mobile", 100, 1],
["2019-07-01", "both", 200, 1],
["2019-07-02", "both", null, null]]}
- 对连接后的表,求和
# Write your MySQL query statement below
selectspend_date, platform,ifnull(sum(total_am),0) total_amount,ifnull(sum(total_u),0) total_users
from
(select p.spend_date, p.platform, t.total_am, t.total_ufrom(select distinct spend_date, "desktop" platform from Spendingunionselect distinct spend_date, "mobile" platform from Spendingunionselect distinct spend_date, "both" platform from Spending) pleft join(select spend_date, if(count(distinct platform)=1, platform, 'both') plat,sum(amount) total_am,count(distinct user_id) total_ufrom Spendinggroup by spend_date, user_id) ton p.platform = t.plat and p.spend_date = t.spend_date
) temp
group by spend_date, platform
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!