df-drills pandas · Polars · DuckDB SQL · DuckDB Relational 题目列表 登录

PIVOT / UNPIVOT 语法

中等 24-duckdb-sql-only DuckDB SQL 专属 pivotunpivotreshape

sales_wide 每行是一个 (region, channel),四个季度的销售额放在 q1–q4 四列。请把它转成“每个 (region, quarter) 一行、每个渠道一列”的形状:

  1. 先把四个季度列转成长表 (region, channel, quarter, amount),quarter 的取值就是原列名 q1…q4;值为 null 的单元格不产生行。
  2. 再按 channel 展开成两列 online、offline,值为对应的销售额。

  3. 输出列固定为 online 和 offline;即使某个渠道在表里一行都没有,这一列也要输出(全为 null)。

  4. 某个 (region, quarter) 在某个渠道没有数值时为 null;在两个渠道都没有数值时,这一行不输出(第 1 步已经没有这样的行了)。
  5. (region, channel) 唯一,channel 只取 online、offline。

输入

  • sales_wide(region, channel, q1, q2, q3, q4)

输出

列为 region, quarter, online, offline,行顺序不限。

输入表 (case base,共 3 个 case:base、gaps、online_only)

sales_wide local/base/sales_wide
#regionstringchannelstringq1float64q2float64q3float64q4float64
1 north online 120.0 135.5 150.0 160.0
2 north offline 200.0 210.0 190.0 220.0
3 south online 90.0 100.0 105.0 98.0
4 south offline 250.0 240.0 260.0 275.5
5 east online 130.0 128.0 140.0 155.0
6 east offline 180.0 185.0 200.0 210.0
共 6 行

期望输出 (case base,行顺序不限)

#regionStringquarterStringonlineFloat64offlineFloat64
1 north q2 135.5 210.0
2 south q2 100.0 240.0
3 east q2 128.0 185.0
4 north q1 120.0 200.0
5 north q3 150.0 190.0
6 north q4 160.0 220.0
7 south q1 90.0 250.0
8 south q3 105.0 260.0
9 south q4 98.0 275.5
10 east q1 130.0 180.0
11 east q3 140.0 200.0
12 east q4 155.0 210.0
共 12 行