在 Oracle 中,将横表(宽表)转换为纵表(长表)通常使用 `UNPIVOT` 函数来实现。你提供的 SQL 查询是从表 `company_days` 中选出 `DAY1` 到 `DAY7` 的字段,现在我们将其转换为按天分列的纵表形式。
---
### ✅ 使用 `UNPIVOT` 实现横表转纵表
```sql
SELECT *
FROM (
SELECT company_name, day1, day2, day3, day4, day5, day6, day7
FROM company_days
)
UNPIVOT (
amount FOR day IN (day1 AS 'DAY1', day2 AS 'DAY2', day3 AS 'DAY3',
day4 AS 'DAY4', day5 AS 'DAY5', day6 AS 'DAY6', day7 AS 'DAY7')
);
```
---
### 输出结果说明:
| COMPANY_NAME | DAY | AMOUNT |
|--------------|------|--------|
| 公司A | DAY1 | 100 |
| 公司A | DAY2 | 200 |
| ... | ... | ... |
- `amount`:表示具体数值。
- `day`:表示原始字段名(如 DAY1、DAY2 等)。
- `company_name`:公司名称字段(如果你的表中没有这个字段,请去掉)
---
### 如果你的 Oracle 版本不支持 `UNPIVOT`(如 10g 或更早版本),可以使用 `UNION ALL` 实现:
```sql
SELECT company_name, 'DAY1' AS day, day1 AS amount FROM company_days
UNION ALL
SELECT company_name, 'DAY2', day2 FROM company_days
UNION ALL
SELECT company_name, 'DAY3', day3 FROM company_days
UNION ALL
SELECT company_name, 'DAY4', day4 FROM company_days
UNION ALL
SELECT company_name, 'DAY5', day5 FROM company_days
UNION ALL
SELECT company_name, 'DAY6', day6 FROM company_days
UNION ALL
SELECT company_name, 'DAY7', day7 FROM company_days;
```
---