SQL ORACLE 取消透视

Posted

技术标签:

【中文标题】SQL ORACLE 取消透视【英文标题】:SQL ORACLE UNPIVOT 【发布时间】:2020-03-31 13:54:42 【问题描述】:

我无法处理这个 unpivot。

select *
    from (select c.country_id, r.region_id, count(*) liczba
    from countries c join regions r on r.region_id = c.region_id
    group by c.country_id, r.region_id)
    UnPivot(
         count(liczba) for r.region_id in (any))
         order by c.country_id

这是代码,但仍然无法正常工作:(

select r.region_name, count(*)
from countries c join regions r on r.region_id = c.region_id
group by r.region_name

这个工作正常。

“无效标识符”

二次想象!

【问题讨论】:

请提供样本数据和期望的结果,以便清楚您想要完成什么。 您还没有告诉我们什么不起作用 - 请在问题中包含您遇到的错误。 any 关键字仅适用于 XML 数据透视表,因此您可能正在尝试做一些普通静态 SQL 无法做到的事情,但目前还不清楚。 (你的内部查询中的count(*) 也不总是1?) 好的,如果你可以再看一遍帖子 当我使用普通数据时,没有任何它不起作用 请不要发布代码或数据的图像;不确定这些显示的是什么,因为它们不是您的查询引用的表。您发布的 unpivot 查询似乎得到 ORA-00905 缺少关键字,而不是 ORA-00904 无效标识符。请包括示例数据、您的实际查询以及您尝试实现的输出。 【参考方案1】:

您的查询没有意义:

UNPIVOT 用于将列转置为行;您只有 3 列 country_idregion_idliczba

UNPIVOT 语法是:

UNPIVOT ( value FOR key IN ( column1 AS 'alias1', column2 AS 'alias2' ) )

您不能将聚合表达式作为值。

您需要指定UNPIVOTing 到行的列;除非您定义了一个名为 any 的列,否则您不能使用 any

您似乎想使用PIVOT 而不是UNPIVOT


我想看看,每个job_id有多少人工作

使用GROUP BYCOUNT

SELECT job_id,
       COUNT(DISTINCT EMPLOYEE_ID) AS number_of_employees
FROM   employees
GROUP BY job_id

使用反透视

这不是UNPIVOT 的用途; UNPIVOT 将列转换为行,而您希望将行聚合在一起。

【讨论】:

好的,知道了。所以,如果我想看看,每个job_id有多少人工作,我应该怎么做? (帖子中的图片)

以上是关于SQL ORACLE 取消透视的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Oracle SQL 中取消透视列时出错

取消透视到 Oracle 中的多个列

Oracle 11g:取消透视多个列并包含列名

如何在 Oracle 11 中取消透视单行?

取消透视表 Oracle 中的数据

取消透视 SQL 表中的所有列