在没有任何聚合函数的情况下将列数据转换为行

Posted

技术标签:

【中文标题】在没有任何聚合函数的情况下将列数据转换为行【英文标题】:Converting column data into row without any aggregate function 【发布时间】:2020-07-20 07:49:22 【问题描述】:

我有一张这样的桌子emp (empno, empname)

empno empname
----------------
1      xxx
2      yyy
3      zzz
..    ....

等等。我见过一些查询,但他们使用的是 PIVOT/UNPIVOT,但如果有聚合函数。我不想使用聚合。

我想将列转换为行。

empno  1    2     3
-----------------------
empnam xxx  yyy   zzz

如何在 Oracle 中使用 SQL 做到这一点?

【问题讨论】:

你为什么不想使用 PIVOT ?它看起来非常适合您的场景。 "我不想使用聚合。"为什么?您是否正在尝试寻找解决重复记录的方法? @Shweta Mishra,如果您不使用 Pivot,而使用 Max case,那么您需要为表中可能存在的每个 empno 写一行。 在 Oracle 中有两个选择:使用 PIVOT 或使用聚合。但无论如何,如果您有很多员工,您可能会达到结果中的最大列数(我认为是 1000) “我不想使用聚合”没有意义。您有几行,并且希望将信息合并到一行中。这几乎就是聚合的定义。认为“聚合”仅表示maxsumlistagg 是一个常见的错误。 PIVOT 在很大程度上是一种聚合形式。所以,再一次:这个问题本身没有意义。你的意思是,你想避免使用maxsum 之类的东西吗?为什么? 【参考方案1】:

您的选择几乎是明确使用PIVOT,或使用枢轴查询,大致如下:

SELECT
    'empnam' AS empno,
    MAX(CASE WHEN empno = 1 THEN empname END) AS "1",
    MAX(CASE WHEN empno = 2 THEN empname END) AS "2",
    MAX(CASE WHEN empno = 3 THEN empname END) AS "3"
FROM yourTable;

【讨论】:

此查询有效,但如果您有 2000 个员工编号会怎样?您是否需要为每个 empno 编写一个 max case 语句。 对。这不是 OP 提出的问题。 @RobertoHernandez 。 . .那么你不能在 Oracle 中表示结果集。 Oracle 最多只支持 1000 列。 @GordonLinoff,这正是我的观点。首先,对于大量记录来说,这个问题没有意义。对于少量记录,您可以使用 MAX case 像您一样完美地构建查询,但对于超过 100 条,我认为这没有意义。那只是我的观点

以上是关于在没有任何聚合函数的情况下将列数据转换为行的主要内容,如果未能解决你的问题,请参考以下文章

oracle如何在没有UNION的情况下将列转置为行

Pyspark 将列列表转换为聚合函数

SqlServer基本操作

在 SQL 中不进行聚合的数据透视

Druid:如何在没有聚合功能的情况下将数值数据添加到指标中

将月份列转换为行并聚合其下的其他列