【问题标题】:I want to rearrange table data basis of column and rows我想重新排列列和行的表数据基础
【发布时间】:2021-12-17 23:10:33
【问题描述】:

我有这样的数据库表:

col1 col2 
1   data1
1   data2
1   data3
2   data4
2   data5
2   data6
3   data7
3   data8
3   data9

(col1 value=1的行数据,将作为列名); 我需要将其转换为以下格式:

col1 data1  data2  data3
2    data4  data5  data6
3    data7  data8  data9
4    data10 data11 data12

我已经尝试过pivot 函数,也尝试过使用过程和函数进行手动转换,但到目前为止没有任何效果。

编辑:我正在使用 oracle。之前我错误地标记了mysql。

【问题讨论】:

  • 您错误地标记了两个不同的 DBMS,Oracle 和 MySQL。你用的是哪两个?那么,每个 col1 值总是正好三行?顺序重要还是 2|data6|data4|data5 对你没问题?
  • 显示问题通常在您的应用程序或网站中处理,而不是在 SQL 中。如果您真的想在 SQL 中执行此操作,窗口函数会很有帮助。 Oracle 长期以来一直在使用它们,但 MySQL 仅从版本 8 开始。所以,如果您使用 MySQL:您使用的是哪个版本?
  • DBMS 表不是电子表格,您可以在其中在任何单元格中输入任何值。 DBMS 结果集结构由解析完成后的语句定义。因此,要拥有动态列名(取决于数据),您需要动态 SQL

标签: sql oracle pivot


【解决方案1】:

在 Oracle 中,您可以使用ROW_NUMBER,然后使用PIVOT

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2) AS rn
  FROM   table_name t
)
PIVOT (
  MAX(col2) FOR rn IN (1 AS col2_1, 2 As col2_2, 3 AS col2_3)
);

其中,对于样本数据:

CREATE TABLE table_name (col1, col2) AS
SELECT CEIL(LEVEL/3), 'data' || LEVEL FROM DUAL CONNECT BY LEVEL <= 9;

输出:

COL1 COL2_1 COL2_2 COL2_3
1 data1 data2 data3
2 data4 data5 data6
3 data7 data8 data9

db小提琴here

【讨论】:

  • "...col1 值为 1 的行的数据将用作列名"。不是关系要求,但它在问题中
  • @astentx 我错过了那一点...... OP只能用动态SQL做到这一点;使用普通的PIVOT 是不可能的,因为无法动态重命名列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
相关资源
最近更新 更多