对比SQL结果集:无数据时保留空白行
嘿,我来帮你搞定这个双年份数据对比的结果集构建问题!根据你给出的期望格式,我整理了两种常见的实现方案,不管你用SQL还是Python都能轻松实现~
构建双年份数据对比结果集的解决方案
核心思路
要生成你需要的格式,关键是要覆盖三种产品数据情况:
- 两年都有销量数据的产品
- 仅2019年有数据、2020年无数据的产品
- 仅2020年有数据、2019年无数据的产品
我们需要先获取所有在这两年内出现过的产品,再分别关联对应年份的数据,最后把空值替换为0,就能得到整齐的对比结果。
SQL实现方案
假设你的原始销售数据存储在名为sales的表中,结构包含product(产品名)、year(年份)、qty(数量)这三个字段。可以用CTE+左连接的方式实现:
WITH all_products AS ( -- 先提取2019和2020年所有出现过的产品 SELECT DISTINCT product FROM sales WHERE year IN (2019, 2020) ) SELECT ap.product AS "PRODUCT", -- 用COALESCE把空值转成0,确保没有数据的年份显示0 COALESCE(s2019.qty, 0) AS "2019 QTY", COALESCE(s2020.qty, 0) AS "2020 QTY" FROM all_products ap -- 左连接2019年的数据 LEFT JOIN sales s2019 ON ap.product = s2019.product AND s2019.year = 2019 -- 左连接2020年的数据 LEFT JOIN sales s2020 ON ap.product = s2020.product AND s2020.year = 2020 -- 按产品名排序,结果更整齐 ORDER BY ap.product;
Python Pandas实现方案
如果你的数据是在Python中处理,用Pandas的透视表功能可以快速实现:
import pandas as pd # 模拟原始数据 data = { 'PRODUCT': ['Car', 'Car', 'Boat', 'Plane'], 'YEAR': [2019, 2020, 2019, 2020], 'QTY': [10, 10, 10, 10] } df = pd.DataFrame(data) # 用透视表整理成对比格式,空值自动填充为0 result = df.pivot_table( index='PRODUCT', columns='YEAR', values='QTY', fill_value=0, aggfunc='sum' ).reset_index() # 重命名列名,匹配你想要的格式 result.columns = ['PRODUCT', '2019 QTY', '2020 QTY'] # 输出结果 print(result)
结果验证
不管用哪种方案,最终都会得到和你期望完全一致的结果:
| PRODUCT | 2019 QTY | 2020 QTY |
|---|---|---|
| Car | 10 | 10 |
| Boat | 10 | 0 |
| Plane | 0 | 10 |
内容的提问来源于stack exchange,提问作者Connor Martin
相关产品推荐
相关产品推荐

