PIVOT / UNPIVOT 语法
中等
24-duckdb-sql-only DuckDB SQL 专属
pivotunpivotreshape
sales_wide 每行是一个 (region, channel),四个季度的销售额放在 q1–q4 四列。请把它转成“每个 (region, quarter) 一行、每个渠道一列”的形状:
- 先把四个季度列转成长表
(region, channel, quarter, amount),quarter 的取值就是原列名 q1…q4;值为 null 的单元格不产生行。
-
再按 channel 展开成两列 online、offline,值为对应的销售额。
-
输出列固定为 online 和 offline;即使某个渠道在表里一行都没有,这一列也要输出(全为 null)。
- 某个
(region, quarter) 在某个渠道没有数值时为 null;在两个渠道都没有数值时,这一行不输出(第 1 步已经没有这样的行了)。
(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)
期望输出 (case base,行顺序不限)
| # | regionString | quarterString | onlineFloat64 | offlineFloat64 |
| 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 行
参考答案 · PIVOT / UNPIVOT 语法