You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对比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)

结果验证

不管用哪种方案,最终都会得到和你期望完全一致的结果:

PRODUCT2019 QTY2020 QTY
Car1010
Boat100
Plane010

内容的提问来源于stack exchange,提问作者Connor Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:17:56