【问题标题】:Pivot Issue ORA-00918 column ambiguously defined枢轴问题 ORA-00918 列定义不明确
【发布时间】:2023-04-04 19:00:01
【问题描述】:

我正在运行以下查询,需要将行输出为列。当我添加第二个 MAX 语句时,我收到一个错误 ORA-00918 列定义不明确。不知道我做错了什么。任何帮助将不胜感激。

SELECT * from ( 
SELECT a.REF_NUM as "Number", a.SUMMARY, a.DESC_SEARCH as "Description", a.Status, e.Label, e.Value
        FROM ca a,
        cr_prp e
    WHERE 
        a.PERSID = e.OWNING_CR
        AND a.CATEGORY = '16996807'
        ORDER by a.REF_NUM DESC)t
    PIVOT
    (
    MAX(CASE WHEN LABEL = 'Plan/UnPlanned' THEN Value END),
    MAX(CASE WHEN LABEL = 'Reason for' THEN Value END),
    MAX(CASE WHEN LABEL = 'Name & "ID"' THEN Value END)
    FOR LABEL
    IN ('Plan/UnPlanned',
        'Reason for',
        'Name & "ID"')
    )

【问题讨论】:

  • 我相信这是因为您有三个VALUE 列。尝试在每个 MAX(...) 行上放置一个别名以区分它们。
  • 你确实需要case 表达式为pivot 为你做这些
  • 我添加了一个别名,但是我现在看到空白列 MAX(CASE WHEN LABEL = 'Plan/UnPlanned' THEN Value END) as A, MAX(CASE WHEN LABEL = 'Reason for' THEN Value END) 作为 B,MAX(CASE WHEN LABEL = 'Name & "ID"' THEN Value END) as C
  • 如果我使用 Pivot,如何在不使用大小写的情况下运行它。
  • pivot 等价于条件聚合:pivot( agg(measure) for col in (val1, ..., valN))agg(case col when val1 then measure end), ... agg(case col when valN then measure end) 或更多 Oracle 风格的 agg(decode(col, val1, measure)), ... 相同(对于空值也更方便)

标签: sql oracle pivot


【解决方案1】:

可能需要这样的东西

select * from tab
    PIVOT
    (
    MAX(Value)
    FOR LABEL
    IN ('Plan/UnPlanned' as PU,
        'Reason for' as R,
        'Name & "ID"' as NI)
 )  


    Number    SUMMARY D     STATUS         PU          R         NI
---------- ---------- - ---------- ---------- ---------- ----------
         2          2 z          2                                1
         1          1 x          1          2                      
         2          2 y          2                     1

即1)给你添加别名pivot标签

  1. 不要将MAX 计算相乘,PIVOT 有责任为每个标签计算max

【讨论】:

  • 非常感谢,效果很好。
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多